我有一个使用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并在需要的地方使用它?
感谢。
答案 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