【问题标题】:CSURF not working if the Session cookie is secure如果会话 cookie 是安全的,则 CSURF 不起作用
【发布时间】:2016-01-05 02:23:15
【问题描述】:

我很困惑当我将 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 中设置“信任代理”:

来源:npm express-session

我目前在本地运行该站点,所以它不是 HTTPS。我想知道secure:true 与未通过 csrf 测试有何关系?

【问题讨论】:

    标签: node.js mongodb session cookies express-session


    【解决方案1】:

    由于提供的代码示例不包括表单的创建,我假设您正确地包含了_csrf 值。或者你用 JavaScript 设置相应的标头。

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

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

    如果您想使用 cookie 而不是 session 作为存储方法,您应该将 cookie: truecookie: cookieOptions 作为初始化值传递给 csurf,而不是手动设置 cookie。

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

    现在说说它在 HTTPS 上失败的部分原因。

    当您设置secure: true 时,它的作用是使用secure 标志从服务器向浏览器发送cookie。

    根据OWASP page

    安全标志是应用服务器在 HTTP 响应中向用户发送新 cookie 时可以设置的选项。安全标志的目的是防止由于 cookie 以明文形式传输而被未授权方观察到。

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

    这包括会话令牌 cookie,用于在 sessionStore 中查找信息。

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

    附带说明,这也意味着您的会话通常会失败。

    注意!作为旁注,如果您更感兴趣,我建议您阅读OWASP CSRF mitigation cheatsheet。或者我关于 Node.js Web Application Security 的书,其中包括 CSRF 和使用 Node.js 实现的各种缓解方法。

    【讨论】:

    • 据我了解,由于我使用不同的会话存储(使用 MongoDB 进行会话),我不应该在会话初始化中设置 cookie 属性。它只会混淆代码?
    • 它会混淆代码,而且由于您没有使用正确的 cookie 设置,csurf 库不会考虑到这一点。
    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 2017-10-17
    • 2017-08-24
    • 1970-01-01
    • 2011-06-11
    • 2015-04-19
    • 2023-03-12
    • 2018-10-10
    相关资源
    最近更新 更多