如何在express,nodejs中的所有视图中传递csrf标记

时间:2016-11-01 11:28:44

标签: javascript node.js forms express csrf

我有一个使用ExpressJS构建的NodeJS应用程序。在进行安全审核之后,我被建议在所有表单和ajax提交中实施CSRF。为此,我使用了csurf包。为此,我们需要在每个表单页面中传递CSRF令牌,然后使用表单提交数据返回它。

首先,我尝试单独为包含表单的页面执行此操作。但后来我意识到我的页面标题中有一个搜索表单,它出现在所有页面上。现在,有没有什么方法可以将CSRF令牌传递给我的所有视图,而不会为每个请求显式传递它。这是我用于渲染表单页面的通用代码。我使用Jade / Pug进行渲染:

router.get('/createcampaign', checkUserSession, middleWare2, middleware3, function(req, res){
    var pageInfo = {};
    pageInfo.title = 'Create New Campaign';
    pageInfo.projects = req.projects;
    pageInfo.session = req.session;
    pageInfo.bodyid = 'createcampaign';
    pageInfo.project_id = req.flash('project_id');
    pageInfo.bodyclass = 'bluebody';
    pageInfo.account = req.account;
    pageInfo.grammars = req.grammars;
    pageInfo.csrfToken = req.csrfToken; //Here I pass csrfToken to view

    res.render( 'users/createcampaign', pageInfo );
});//createcampaign get route

如您所见,我需要传递带有视图上下文对象的csrfToken。 如何全局传递,以便传递给所有视图?

另外,安全性是否安全,在所有页面上发送此csrfToken并在需要的地方使用它?

感谢。

1 个答案:

答案 0 :(得分:2)

create a middleware that will pass a token to the token property to the request object
var csrf = require('csurf')   
app.use(csrf())
app.use(function(request,response,next){
    app.locals._token = request.csrfToken()
    next() 
})

and you can use the variable _token in your view