首页 文章

如果会话cookie是安全的,CSURF不工作

提问于
浏览
2

我很难过,当我将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 回答

  • 2

    由于提供的代码示例不包括表单的创建,我将假设您正确包含 _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: truecookie: cookieOptions 作为初始化值传递给 csurf ,而不是手动设置cookie .

    这是相关的,因为如果您不使用预期的选项参数, csurf 将尝试从会话对象中查找用于验证的标记值,这意味着您的cookie设置无效 .

    Now as for the part why it fails on HTTPS.

    设置 secure: true 时,它将使用 secure 标志将cookie从服务器发送到浏览器 .

    根据OWASP page

    安全标志是一个选项,可以在HTTP响应中向用户发送新cookie时由应用程序服务器设置 . 安全标志的目的是防止由于以明文形式传输cookie而被未授权方观察到cookie . 为了实现这一目标,支持安全标志的浏览器只会在请求进入HTTPS页面时发送带有安全标志的cookie . 换句话说,浏览器将不发送具有通过未加密的HTTP请求设置的安全标志的cookie .

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

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

    作为旁注,这也意味着您的会话通常会失败 .

    NB!作为附注,如果你更感兴趣,我建议你阅读OWASP CSRF mitigation cheatsheet . 或者我的书Node.js Web Application Security,其中包括CSRF和Node.js实现的各种缓解方法 .

相关问题