【问题标题】:CSRF token issues with ExpressExpress 的 CSRF 令牌问题
【发布时间】:2014-09-25 22:20:08
【问题描述】:

我正在尝试使用 csurfexpress 使 CSRF 保护工作。我的应用程序使用 Angular 作为前端,所以我认为将它添加到我的应用程序就足够了:

app.use(cookieParser('test secret'));
app.use(cookieSession({
    secret: 'test secret'
}));
app.use(csrf({
    cookie: {
        key: 'XSRF-TOKEN'
    }
}));

但是,当我尝试发出 POST 请求时,我收到 403(“无效的 CSRF 令牌”)错误。 据我所知,问题在于csrf-tokens 模块:在第44 行,expected 变量看起来像qMnHLQGhivxECx5WtwuktDNA-snimacq30z-XNh2X-KTpdlkU6Og,而secrettoken 变量看起来像qMnHLQGhivxECx5WtwuktDNA。由于expectedtoken不同,会出现403错误。

到目前为止,我已经尝试了以下方法:

  • 在我的csurf 选项中设置secure: false 和/或signed: true
  • 确保我的cookie-sessioncookie-parser 中间件在csurf 之前运行
  • 重新安装我所有的 npm 模块以防万一
  • 对着我的电脑大喊大叫

我可以,可能,切换到基于会话的令牌,但这不会与 Angular 一样顺利,我不确定它是否能解决我的问题。

有谁知道如何解决这个问题,或者可能是什么原因?

PS 顺便说一句,我还注意到一个(可能不相关的)问题:req.csrfToken() 方法似乎返回的字符串的值与 @987654343 中的 expected 值完全无关@ 或存储在 cookie 中的字符串。

【问题讨论】:

标签: node.js angularjs express csrf


【解决方案1】:

关于 csurf 库有一个错误/错误的实现。 cookie "XSRF-TOKEN" 不存储 csrf Token,而是 csurf 用于生成 csrf 令牌的秘密。因此,您的应用程序的 Angular 部分识别 XSRF-TOKEN 并将标头正确附加到 HTTP 请求,但 csurf 中间件不会将密钥识别为有效的 CSRF 令牌本身。要解决此问题,您应该将其实现为:

var cookieParser = require('cookie-parser');
var cookieSession = require('cookie-session');
app.use(cookieParser("secret"));
app.use(cookieSession({secret: "secret2"}));
app.use(csrf());
app.use(function (req, res, next) {
    res.cookie("XSRF-TOKEN",req.csrfToken());
    return next();
});

req.csrfToken() 将根据存储的秘密生成 csrf 令牌,在这种情况下,在由 csrf 中间件生成的 req.session.csrfSecret 变量中。然后,它会工作。

编辑:请参阅此问题on GitHub

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 2016-01-02
    • 2011-09-28
    • 2011-07-19
    • 2014-10-06
    • 1970-01-01
    • 2018-03-15
    • 2018-04-07
    • 2018-12-31
    相关资源
    最近更新 更多