8

我尝试在我的快递应用程序中的几条路线上使用 csurf。这就是方法:

var express       = require('express');
var session       = require('express-session');
var csrf          = require('csurf');

// some more stuff

var csrfExclusion = ['/myApi','/unsecure'];

var app   = express();

var conditionalCSRF = function (req, res, next) {  
  if (csrfExclusion.indexOf(req.path) !== -1){
    next();
  }
  else{
    csrf();
  }
});

app.use(conditionalCSRF);

甚至尝试过:

var conditionalCSRF = function (req, res, next) {  
  if (csrfExclusion.indexOf(req.path) !== -1){
    next();
  }
  else{
    csrf(req, res, next);
    next();
  }
});

var conditionalCSRF = function (req, res, next) {  
  if (csrfExclusion.indexOf(req.path) !== -1){
    next();
  }
  else{
    csrf();
    next();
  }
});

但这给了我一个错误: Object # has no method 'csrfToken'

如何有条件地使用 csurf。该文档仅提供在 express 应用程序中的所有路线上使用它的信息

app.use(csrf());

但这不是我想要的,我想排除一些路线......

好心……马丁

更新:

最后它起作用了。我做了以下事情:

app.use(function(req, res, next){
  if (csrfExclusion.indexOf(req.path) !== -1) {
  next();
}
  else {
  csrf()(req, res, next);
});

这有条件地添加了 csrf 中间件。但我真的觉得这样称呼它有点奇怪:

csrf()(req, res, next);

我什至不明白语法...

4

2 回答 2

6

据此,需要将其拆分为两个路由器,一个使用 csurf,一个不使用。然后,您将中间件应用到路由器而不是应用程序。

var routes = express.Router();
var csrfExcludedRoutes = express.Router();

routes.use(csrf());

routes.get('/', function(req, res) {
    //has req.csrfToken()
});

csrfExcludedRoutes.get('/myApi', function(req, res) {
    //doesn't have req.csrfToken()
});
于 2014-07-28T10:45:32.273 回答
2

这是一个旧线程,但我偶然发现它并认为我会尝试解决@marshro 提出的关于调用csrf()(req, res, next)中间件的奇怪问题。

这里发生的是 csurf 从 require 语句返回一个函数,该函数本身用于构建带有一些可选配置参数的中间件函数。

上面的中间件中使用的调用csrf()为每个需要 csrf 保护的传入请求构建了中间件函数,其中包含默认选项。如果您真的想使用这种方法,您确实有机会进行简单的更改以使您的解决方案更有效,只需一次非常小的重组即可构建中间件:

// 1. Build the csrf middleware function 'csrfMw' once.
var csrfMw = csrf();          

app.use(function(req, res, next){
    if (csrfExclusion.indexOf(req.path) !== -1) {
        next();
    } else {
        // 2. Use the middleware function across all requests.
        csrfMw(req, res, next);  
    }
);

这就是说 - 当您有机会时,您可能想再次查看文档 - 建议使用两种方法来避免这种方法。第一个设置中间件csrfProtection并将其应用于选择路由。第二个设置了两个路由器,如上面提到的@ben-fortune - 一个将 csrf 应用于所有东西,一个不应用。两者都比排除条件更有效。

所有这一切 - 我可以看到有一个排除列表的情况,如果我没有时间手动分割路线,可以使用你的方法。;)

于 2016-04-08T15:16:16.467 回答