禁用CSRF验证关于快一些要求(Disable csrf validation for some r

2019-07-04 01:43发布

我正在写使用Node.js的快递框架小的Web应用程序。 我使用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控制。

Answer 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()) 你只是想找到一个表达方式,使其干净的时候中间件会或不会被使用。



Answer 2:

由于快递中间件,以便为执行,你可以始终把代码的CSRF()语句你上面的语句。

像这样:

app.get '/ping', (req, res) -> res.status(200).end()
app.use csrf()

之前你CSRF令牌被设置Express将返回。 对于端点的非常小的数字(我只是有一个适合这一类),我发现这是一个清晰的解决方案。

此外,截至记者发稿,针对上述答案的代码是这样的:

customCsrf = (req, res, next) ->
  if req?.url isnt '/ping'
    return csrf()(req, res, next)
  else
    return next()

app.use customCsrf

额外的(REQ,水库,下一个)绊倒了我一段时间,所以希望这可以帮助别人。



Answer 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)


文章来源: Disable csrf validation for some requests on Express