如何解决在 express/nodejs 中使用多个选项卡处理 csrf 的问题?

How to resolve issue with handling csrf with multiple tabs in express/nodejs?

我使用以下配置在我的 nodejs/express 应用程序中构建了 CSRF 保护:

var app = express(),
    cookieParser = require('cookie-parser'),
    session = require('express-session'),
    csrf = require('csurf');

app.use(cookieParser());
app.use(session({
    , saveUninitialized: true
    , resave: true
    , store: new MongoStore()
}));

app.use(flash());

并使用以下登录表单:

<form action="/process" method="POST">
  <input type="hidden" name="_csrf" value="{{csrfToken}}">
  <button type="submit">Submit</button>
</form>

当用户打开两个浏览器选项卡并且故事的结尾在 this line 处出现 EBADCSRFTOKEN 错误时,问题就出现了:

我们来看下面的案例:

  1. 用户在两个单独的选项卡中打开上面的表单。
  2. 在第一个选项卡中,他注销并再次登录。
  3. 然后切换到第二个标签,点击提交,出现EBADCSRFTOKEN错误。

我需要指出我在 logout 路线中破坏了我的会话:

app.route('/auth/signout')
    .get(function (req, res, next) {

        return req.session.destroy(function (err) {
            if (err) return next(err);

            return res.redirect('/');
        });
    });

因为我销毁了会话,所以我销毁了存储在那里的秘密密钥。因此,这种破坏会导致第二个选项卡上的令牌无效和 EBADCSRFTOKEN 错误。

我需要以某种方式解决这个问题。你在这种情况下做什么?显示弹出窗口以重新加载页面或自动重新加载页面?

csrf 令牌应在提交表单之前设置并从 cookie 中检索。假设,你用 csrf C1 打开 tabA。打开 tab2 后,csrf 变为 C2。但是,如果这是在 cookie 中设置的,从 tabA 中的 cookie 中获取 csrf 将给出 C2 作为 csrf 令牌。

session->logout->new_session也可以得出同样的结论。保存并从 cookie 中获取所有内容。由于您在 tab2 中注销后登录,因此 tab1 将具有 tab2 的 cookie 以及 csrf 令牌。