如何解决在 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
错误时,问题就出现了:
我们来看下面的案例:
- 用户在两个单独的选项卡中打开上面的表单。
- 在第一个选项卡中,他注销并再次登录。
- 然后切换到第二个标签,点击提交,出现
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 令牌。
我使用以下配置在我的 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
错误时,问题就出现了:
我们来看下面的案例:
- 用户在两个单独的选项卡中打开上面的表单。
- 在第一个选项卡中,他注销并再次登录。
- 然后切换到第二个标签,点击提交,出现
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 令牌。