如果Session cookie是安全的,则CSURF不起作用

当我将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的网站 ,即HTTPS对于安全cookie是必需的。 如果设置了安全性,并且您通过HTTP访问您的站点,则Cookie不会被设置。 如果您有一个代理服务器后面的node.js,并且使用secure:true,则需要设置“trust proxy”为express:

资料来源: npm快速会议

我目前在本地运行该网站,所以它不是HTTPS。 我想知道是如何secure:true涉及到不通过csrftesting?

由于提供的代码示例不包括窗体的创build,我将假定您正确包含_csrf值。 或者你用JavaScript设置相应的标题。

我们先来解释为什么你不应该做res.cookie('XSRF-TOKEN',req.csrfToken());

csurf模块工作的默认方式是在运行req.csrfToken()时生成或返回_csrf标记,但它也将此标记保存在会话中。

如果要使用Cookie而不是会话作为存储方法,则应将cookie: truecookie: cookieOptions作为初始化值传递给csurf而不是手动设置cookie。

这是相关的,因为如果您不使用预期的选项参数, csurf将尝试从会话对象中查找令牌值进行validation,这意味着您的cookie设置是无用的。

现在至于HTTPS失败的部分。

当您设置secure: true做法是从服务器发送cookie到secure标志的浏览器。

根据OWASP页面 :

安全标志是在HTTP响应中向用户发送新cookie时应用服务器可以设置的选项。 安全标志的目的是为了防止未经授权的人员以明文forms传输cookie。

为了实现这个目标,当请求转到HTTPS页面时,支持安全标志的浏览器将只发送带有安全标志的cookie。 换句话说,浏览器不会发送一个cookie,其中的安全标志设置在未encryption的HTTP请求上

这包括会话标记cookie,用于查找sessionStore中的信息。

所以浏览器不会发送会话cookie到服务器。 服务器创build一个新的空会话,因为我们回到默认的csurf操作方法,它将尝试从空会话中查找令牌。 不会有一个令牌,所以比较将失败。

作为一个侧面说明,这也意味着你的会话通常会失败。

NB! 作为一个侧面说明,如果你更感兴趣,我build议你阅读OWASP CSRF缓解作弊表 。 或者我关于Node.js Web应用程序安全性的书籍,其中包括CSRF和Node.js实现的各种缓解方法。