我很难过,当我将cookie设置为安全时,节点的csrf无效 .
//Load Cooike Parser
app.use(cookieParser(secret));
//Load Session Store
app.use(require('express-session')({
secret:secret,
cookie:{
maxAge: 1000 * 60 * 60 * 24, // 1 day,
secure: true,
httpOnly: true
},
store: sessionStore
}));
//Load POST data parser
//Form sent should be in JSON format
app.use(bodyParser.json());
//Initiate CSRF on middleware
//set the CSRF cookie Header
app.use(csrf());
app.use(function(req,res,next){
res.cookie('XSRF-TOKEN',req.csrfToken());
next();
});
此设置使用MongoDB存储会话数据 . 阅读 express-session
文档,我遇到了这个......
请注意,secure:true是推荐选项 . 但是,它需要启用https的网站,即安全cookie需要HTTPS . 如果设置了安全性,并且您通过HTTP访问您的站点,则不会设置cookie . 如果你的node.js在代理后面并使用secure:true,你需要在express中设置“trust proxy”:
资料来源:npm express-session
我'm currently running the site locally, so it'不是HTTPS . 我想知道 secure:true
与没有通过csrf测试有什么关系?
1 回答
由于提供的代码示例不包括表单的创建,我将假设您正确包含
_csrf
值 . 或者您使用JavaScript设置相应的标头 .Let's start by explaining why you shouldn't be doing res.cookie('XSRF-TOKEN',req.csrfToken());.
csurf
模块的默认方式是在运行req.csrfToken()
时生成或返回_csrf
标记,但它也会在会话中保存此标记 .如果要使用cookie而不是会话作为存储方法,则应将
cookie: true
或cookie: cookieOptions
作为初始化值传递给csurf
,而不是手动设置cookie .这是相关的,因为如果您不使用预期的选项参数,
csurf
将尝试从会话对象中查找用于验证的标记值,这意味着您的cookie设置无效 .Now as for the part why it fails on HTTPS.
设置
secure: true
时,它将使用secure
标志将cookie从服务器发送到浏览器 .根据OWASP page:
这包括会话令牌cookie,用于在sessionStore中查找信息 .
因此浏览器不会向服务器发送会话cookie . 服务器创建一个新的空会话,因为我们回到默认的
csurf
操作方法,它将尝试从空会话中查找一个令牌 . 没有令牌,因此比较将失败 .作为旁注,这也意味着您的会话通常会失败 .
NB!作为附注,如果你更感兴趣,我建议你阅读OWASP CSRF mitigation cheatsheet . 或者我的书Node.js Web Application Security,其中包括CSRF和Node.js实现的各种缓解方法 .