1

我将csrf中间件与Express框架一起使用。我的登录页面是这样的:

app.get('/', getUserOrLogin, function (req, res) {
  // do something...
});

在哪里getUserOrLogin

// Return the user otherwise redirect to login page
var getUserOrLogin = function (req, res, next) {
  var user = req.session.user;

  if (user == null) {
    req.session.backTo = req.originalUrl; 
    res.redirect('/login');
  } else {
    req.user = user;
    next();
  }
};

当我尝试访问/时,它会将我正确重定向到,但未设置 cookie 中/logincsrf令牌。

我是在功能上做错了什么getUserOrLogin还是 Express 错误?

4

1 回答 1

1

我发现了错误。因为我不想csrf控制每个页面,所以我使用了条件函数:

// Disable CSRF for some requests
var conditionalCSRF = function (req, res, next) {
  var whitelist = ['/inbound'];

  if (req.method !== 'POST') {
    next();
    return;
  }
  if (whitelist.indexOf(req.url) !== -1) {
    next();
  } else {
    (express.csrf())(req, res, next);
  }
};

app.use(conditionalCSRF);

csrf但是在用户需要一个需要它的页面之前,该函数不会设置令牌。所以我就这样修改了

var connect = require('connect');

// Disable CSRF for some requests
var conditionalCSRF = function (req, res, next) {
  var whitelist = ['/inbound'];

  req.session._csrf || (req.session._csrf = connect.utils.uid(24));

  if (req.method !== 'POST') {
    next();
    return;
  }
  if (whitelist.indexOf(req.url) !== -1) {
    next();
  } else {
    (express.csrf())(req, res, next);
  }
};

app.use(conditionalCSRF);
于 2012-11-29T09:43:02.293 回答