2016-11-01 6 views
0

У меня есть приложение NodeJS, построенное с использованием ExpressJS. После обзора безопасности мне предложили внедрить CSRF для всех форм и ajax-представлений. Для этого я использовал csurf пакет. Для этого нам нужно передать токен CSRF на каждой странице формы, а затем вернуть его с данными представления формы.как передать токен csrf во всех представлениях в express, nodejs

Во-первых, я попытался сделать это индивидуально для страниц, содержащих формы. Но позже я понял, что у меня есть форма поиска в моем заголовке страницы, который появляется на всех страницах. Теперь я могу передать токен CSRF ко всем моим представлениям, не передавая их явно для каждого запроса. Вот общий код, который я использую для рендеринга моих страниц формы. Я использую Jade/МОПС для рендеринга:

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 на все страницы и использовать его везде, где это необходимо?

Спасибо.

ответ

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 
+0

Thanks @yvesdaxmaz. Я сделал что-то подобное, но вместо 'app.locals' использовал' res.locals'. Можете ли вы предложить, какой из них лучше, и его следует использовать? –

+0

res.locals ограничивает запрос, с которым связано, с другой стороны, приложение.locals доступно во всем вашем шаблоне – yvesdaxmaz

+0

, все они схожи и могут использоваться с той же целью, разница в том, что я даю в приведенном выше комментарии , – yvesdaxmaz

 Смежные вопросы

  • Нет связанных вопросов^_^