首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C冲浪无效csrf令牌Express / nodejs

C冲浪无效csrf令牌Express / nodejs
EN

Stack Overflow用户
提问于 2015-06-09 17:13:41
回答 1查看 6.9K关注 0票数 6

我有这种奇怪的行为--我第一次加载页面时就会出现错误,基本上就是'EBADCSRFTOKEN' --我一直在试图找出为什么只有在第一次加载页面时才会发生这种情况,如果我点击refresh并得到一个新的令牌--一切都很好。

当我删除cookie、点击refresh并得到一个新的令牌时也会发生同样的情况,但是第一次总是失败,我不知道为什么预期的字符串和令牌都不匹配。

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

代码语言:javascript
复制
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
    });
});

中间件:

代码语言:javascript
复制
module.exports = function(app) {
    app.use(function(req, res, next){
        res.cookie('x-xsrf-token', req.csrfToken());
        res.locals.csrftoken = req.csrfToken();
        next();
    });
};

令牌的不同值:

Cookie

fgeHcu6v-hgdCMuRjnmE9BYV_QrvrfzwJoeA

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

fgeHcu6v-hgdCMuRjnmE9BYV_QrvrfzwJoeA

预期(在c冲浪库中)

FgeHcu6v-T9CuTWL8hVGHMtSspech0yzqaP0k

令牌(在c冲浪库中)

fgeHcu6v-hgdCMuRjnmE9BYV_QrvrfzwJoeA

似乎期待是类似的象征和他们不同的只是在冲刺后,有什么想法吗?

更新:

基本上,我遵循@shakiba建议--我删除了我的自定义中间件,并让c冲浪库来处理它。

我将配置更改为:

代码语言:javascript
复制
app.use(csrf({ cookie: true }));

现在我得到了一个名为_csrf的cookie,现在问题有点不同了,令牌值与库中的秘密令牌相同,所以当库“将秘密令牌转换为他们不匹配的预期令牌”时。

以下是一些示例值:

Cookie BDir8-6 6hkdy_YsXNb305IIx

bdir8-6 6hkdy_ysxNb305IIx

令牌BDir8 8-6 6hkdy_YsXNb305IIx

期望BDir8 8-zbwt4 4-K_Uv8t1TtmxctkfcMN1M

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-09 23:10:59

我相信您并没有正确地使用c冲浪,而是为您设置cookie,您不应该自己设置它,并且它的值与csrfToken()值不同。据我从docs和源代码中了解到,csrfToken()值是使用c冲浪为cookie设置的值生成的,因为它们是状态,以减少入侵攻击。

我已经做了一个更简单的版本,它只使用cookie,不做任何关于入侵攻击的事情,因为在我看来,入侵攻击是一个独立的关注点,应该在一个独立的模块/库中解决。我会在github上分享它,如果你愿意的话,你可以使用它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30738633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档