如何在express、nodejs的所有视图中传递csrf令牌

Moh*_*waj 1 javascript forms csrf node.js express

我有一个使用 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
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要将 csrfToken 与视图上下文对象一起传递。如何全局传递它以便将其传递到所有视图?

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

谢谢。

Yve*_*ndo 5

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
Run Code Online (Sandbox Code Playgroud)