Подтвердить что ты не робот

Отключить проверку 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.

4b9b3361

Ответ 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)