【问题标题】:Csrf token not set on Express when redirect重定向时未在 Express 上设置 Csrf 令牌
【发布时间】:2012-11-29 17:43:02
【问题描述】:

我正在使用带有 Express 框架的 csrf 中间件。我的登录页面是这样的:

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();
  }
};

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

我是在 getUserOrLogin 函数上做错了什么还是 Express 错误?

【问题讨论】:

  • 如果将 backTo 值分配给 response 对象而不是 request 对象会怎样?
  • csrf中间件是在路由器之前定义的吗?另外,当您说 cookie 时,您是指会话吗?除非您正在做其他事情,否则 csrf 不会设置 cookie,只会设置 _csrf 会话令牌。第三,你是用什么做auth的,登录路由是什么样子的?

标签: node.js redirect express csrf


【解决方案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);

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 2020-05-29
    • 2014-09-25
    • 2018-11-05
    • 1970-01-01
    • 2016-06-22
    • 2021-11-25
    • 2020-05-11
    • 2012-09-01
    相关资源
    最近更新 更多