node.js - Csurf 无效的 csrf token Express/nodejs

标签 node.js cookies express csrf mean-stack

我有这种奇怪的行为 我在第一次加载页面时遇到错误,基本上是 'EBADCSRFTOKEN' 我一直在努力弄清楚为什么它只在第一次加载页面时发生加载,如果我点击刷新并获得一个新 token ,一切正常。

同样的情况发生在我删除 csurf cookie 时,点击刷新并获得一个新 token ,但第一次总是失败我不确定为什么预期的字符串和 token 不匹配。

一段代码(我正在使用 MEANJS 堆栈):

app.use(busboy());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json({limit: '50mb'}));
app.enable('jsonp callback');

var cp = cookieParser;
app.use(cp());

var mStore = new mongoStore({
    db: db.connection.db,
    collection: config.sessionCollection
});

app.use(session({
    secret: config.sessionSecret,
    store: mStore,
    cookie: {httpOnly: false},
    key:config.cookieKey,
}));

app.use(csrf());

//setting up a middleware
var middlewareFiles = [
    'csrf-rule.server.js', 
    'secure-routes.server.js'
];

middlewareFiles.forEach(function(routeSecure){
    require(path.resolve('./app/middleware/'+routeSecure))(app);
});

app.use(function(err, req, res, next) {
    if (!err) return next();
        if(err.code === 'EBADCSRFTOKEN'){
            res.json(484, {data: 'invalid csrf token.'});
        return;
    }
   // Error page
    res.status(500).render('500', {
        error: err.stack
    });
});

中间件:

module.exports = function(app) {
    app.use(function(req, res, next){
        res.cookie('x-xsrf-token', req.csrfToken());
        res.locals.csrftoken = req.csrfToken();
        next();
    });
};

token 的不同值:

Cookie

fgeHcu6v-hgdCMuRjnmE9BYV_QrvrfzwJoeA

req.csrfToken()(在中间件请求中)

fgeHcu6v-hgdCMuRjnmE9BYV_QrvrfzwJoeA

预期(在 csurf 库中)

fgeHcu6v-T9CuTWL8hVGHMtSskeh0yzqaP0k

token (在 csurf 库中)

fgeHcu6v-hgdCMuRjnmE9BYV_QrvrfzwJoeA

似乎 expected 与 token 相似,只是在破折号之后有所不同,有什么想法吗?

更新:

基本上,我按照@shakiba 的建议删除了自定义中间件,让 csurf 库处理它。

我将配置更改为:

app.use(csrf({ cookie: true }));

现在我得到一个名为 _csrf 的 cookie,现在问题有点不同, token 值与库中的 secret token 相同,所以当库 "转换" secret token 是他们不匹配的预期 token

这些是一些示例值:

Cookie BDir8-6hkdy-_YsXNb305IIx

secret BDir8-6hkdy-_YsXNb305IIx

token BDir8-6hkdy-_YsXNb305IIx

预期 BDir8-zbwt4-K_Uv8t1TtmxxctkfcMN1M

最佳答案

我相信你没有正确使用 csurf,csurf 为你设置了 cookie,你不应该自己设置它,它的值与 csrfToken() 值不同。据我从文档和源代码中了解到,csrfToken() 值是使用 csurf 为 cookie 设置的值生成的,因为它们 state减轻 BREACH 攻击。

我制作了更简单的 csurf 版本,它只使用 cookie,对 BREACH 攻击没有做任何事情,因为 BREACH 攻击在我看来是一个独立的问题,应该在独立的模块/库中解决。我会在 github 上分享它,如果您愿意,可以使用它。

关于node.js - Csurf 无效的 csrf token Express/nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738633/

相关文章:

javascript - Keystonejs:自定义名称到管理 UI 的默认列

javascript - 设置cookie只播放一次动画(jquery)

javascript - 用于管理 cookie 的 jquery 插件

node.js - 如何根据用户是否登录来控制流量?

javascript - 无法在模型 `user` 上找到主键属性。所有模型都必须包含一个充当主键的属性

Node.js:使用参数进行 HTTP POST

Javascript 打印 node.js 版本和模块版本

node.js - `fs-extra` 与 `bluebird ` 集成得到 `Cannot read property ' 然后 ' of undefined` 错误

javascript - 我如何在没有 cookie 的情况下跟踪用户

node.js - express-validator:如何检查查询