4

当用户登录到我的网站时,它会创建 2 个 cookie,一个带有会话 ID(与后端的用户 ID 相关),另一个是持续 3 个月的记住我的 cookie。

记住我 cookie 的构造如下:

userid:timeout:hash

其中哈希是 HMAC SHA256 哈希,userid:timeout以防止篡改。

如果会话 ID 不存在(用户关闭浏览器并再次打开,cookie 消失了,或者会话 ID 在 memcached 中不存在),它会查看记忆 cookie 并重新生成一个新的会话 cookie,前提是它有没有超时并且哈希是正确的。

但是,我根本看不到拥有会话 cookie 的意义,因为会话 ID 只是指向后端中的用户 ID。我可以使用记住我的 cookie 来检索当前用户。

所以我正在考虑完全取消会话cookie,并且有兴趣听到一些关于此的想法。这种方法听起来相对安全吗?我可以让它变得更好吗?

提前致谢!

4

1 回答 1

1

是的,在大多数情况下它确实足够安全,但是为什么在可以避免的情况下在 cookie 中包含用户特定数据呢?此外,这样做还有一个小缺点:

如果用户设法从另一个用户那里窃取 cookie,会发生什么情况,您必须更改生成 cookie 的整个方式,否则该用户将始终有权访问,因此重置每个人的 cookie。现在想象一下,被偷的是你的饼干......

这是我的解决方案:在名为“userhash”的用户表中创建另一行。当用户登录时,您会生成一个随机散列,而不需要他的任何输入,只是随机的,并将其存储在表和 cookie 中。然后你只需要存储userhash:timeout在cookie中。您检查数据库以查看它是否存在,如果存在,那就是您的用户。当用户注销时,cookie 和数据库中的行被删除。出于显而易见的原因,您必须在比较之前检查 cookie 是否存在(会有很多空的)。

注意:此方法一次只允许一个注册的 cookie,因此不能使用笔记本电脑 + 台式机。这很好,因为窃取变得更加困难,因为它只持续到真实用户不登录的情况下,而不好的是因为它只允许一台计算机。但是您会看到这个想法以及如何使用此方法,但要让多台计算机登录...类似于 facebook。

PD,如果您说您的应用程序实际上必须有多安全,那就太好了...

PD2,如果您还没有考虑过,还有其他更严重的安全问题(比如说 SSL)。

于 2013-03-05T15:55:24.087 回答