Отключить проверку csrf для некоторых запросов в Express
Я пишу небольшое веб-приложение с Node.js, используя фреймворк Express. Я использую промежуточное ПО csrf, но я хочу отключить его для некоторых запросов. Вот как я включаю его в свое приложение:
var express = require('express');
var app = express();
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.cookieSession({secret: 'secret'}));
app.use(express.csrf());
Я хочу установить POST-маршрут без элемента управления csrf.
Ответы
Ответ 1
Существует несколько возможных подходов. Вам в основном нужно понять, что является самым простым и правильным правилом, чтобы решить, следует ли использовать промежуточное программное обеспечение csrf. Если вы хотите csrf большую часть времени, за исключением небольшого белого списка шаблонов запросов, следуйте примеру в этом ответе, который я имею о промежуточном промежуточном средстве условного ведения журнала (скопировано ниже для удобства).
var express = require("express");
var csrf = express.csrf();
var app = express.createServer();
var conditionalCSRF = function (req, res, next) {
//compute needCSRF here as appropriate based on req.path or whatever
if (needCSRF) {
csrf(req, res, next);
} else {
next();
}
}
app.use(conditionalCSRF);
app.listen(3456);
Другими подходами могут быть только использование промежуточного программного обеспечения на определенном пути, например app.post('/forms/*', express.csrf())
. Вы просто хотите найти выразительный способ сделать его чистым, когда промежуточное ПО будет использоваться или не будет использоваться.
Ответ 2
Так как промежуточное ПО Express выполняется по порядку, вы всегда можете помещать свои выражения в оператор csrf() в коде.
Вот так:
app.get '/ping', (req, res) -> res.status(200).end()
app.use csrf()
Express вернется, прежде чем ваш токен csrf будет установлен. Для очень небольшого числа конечных точек (у меня есть только тот, который подходит для этой категории), я нашел это более чистым решением.
Кроме того, на момент написания этого кода код для вышеуказанного ответа будет выглядеть следующим образом:
customCsrf = (req, res, next) ->
if req?.url isnt '/ping'
return csrf()(req, res, next)
else
return next()
app.use customCsrf
Это лишнее (req, res, next) несколько раз подстегнуло меня, поэтому надеюсь, что это кому-то поможет.
Ответ 3
dailyjs.com содержит хорошую статью о csrf и выражении. Он в основном работает следующим образом:
используйте промежуточное ПО csrf:
app.configure(function() {
// ...
app.use(express.csrf());
// ..
});
создать собственное промежуточное программное обеспечение, которое устанавливает локальную переменную token
в значение csrf:
function csrf(req, res, next) {
res.locals.token = req.session._csrf;
next();
}
используйте свое настраиваемое промежуточное ПО в каждом желаемом вами маршруте:
app.get('/', csrf, function(req, res) {
res.render('index');
});
в вашей форме создайте скрытое поле, содержащее значение csrf:
form(action='/contact', method='post')
input(type='hidden', name='_csrf', value=token)