Node.js/Express. 重新生成会话

13

我有一个简单的Node.js/Express应用程序。为了保存用户身份验证,我使用:

req.session.auth = user;

但是我找到了一个重新生成方法:这里

req.session.regenerate(function (err) {
   req.session.auth = user;
});

我的问题是:我应该使用regenerate方法还是只需使用req.session.auth = user;

1
我发现passportjs在管理express应用程序中的身份验证和会话方面非常出色。http://passportjs.org/ - Rex Morgan
2
req.session.regenerate 更好地防止了会话固定。 - Muhammad Umer
auth-flows https://github.com/OhadR/authentication-flows-js 能够很好地管理并提供所有流程,如创建账户、忘记密码等。 - OhadR
2个回答

19

我更倾向于使用req.session.regenerate,但这取决于你想要做什么。如果你只是用req.session.auth = user,那么你会将认证信息存储在会话中。然而,如果你使用regenerate,你实际上会清除整个会话,然后保存认证信息。

区别在于,使用第一种方法,当前会话中的任何其他会话变量都将持久化。你需要自己判断是否对你的网站有意义,或者是否希望在完成认证后会话保持干净。


1
实际上,在用户认证后,您应该始终使用req.session.regenerate来防止会话固定攻击
根据MDN的说法,用户认证后应始终重新生成会话cookie。为此,您必须通过重新生成会话来内部更改会话ID。

如果您的网站对用户进行身份验证,每当用户进行身份验证时,应重新生成并重新发送会话cookie,即使已存在。这种方法有助于防止会话固定攻击,其中第三方可以重用用户的会话。

如果您想/需要保留上一个会话的某些变量,您需要手动复制它们。
let session = req.session;
req.session.regenerate(function (err) {
    req.session.auth = user;
    req.session.some_var = session.some_var;
});

有关会话固定攻击的更多信息可以在这里找到 https://owasp.org/www-community/attacks/Session_fixation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接