当用户登录我的网站时,它会创建2个cookie,一个具有会话ID(与后端的用户ID相关),并且记住我持续3个月的cookie。
记住我的cookie构造如下:
userid:timeout:hash
哈希是userid:timeout
的HMAC SHA256哈希,以防止篡改。
如果会话ID不存在(用户关闭浏览器并再次打开它以便cookie消失,或者memcached中不存在会话ID),它会查看remember cookie并重新生成新的会话cookie,提供它没有超时,哈希是正确的。
但是我根本没有看到会话cookie的意义,因为会话ID只指向后端的用户ID。我可以使用记住我的cookie来检索当前用户。
所以我想完全废弃会话cookie,并且有兴趣听一些关于此的想法。这种方法听起来相对安全吗?我可以做得更好吗?
提前致谢!
答案 0 :(得分:1)
是的,对于大多数情况来说它确实足够安全,但为什么在可以避免的情况下在cookie中包含用户特定数据呢?此外,这有一个小缺点:
如果用户设法从其他用户窃取cookie,您必须更改生成Cookie的整个方式或用户将始终拥有访问权限,从而重置所有人的Cookie,会发生什么情况。现在想象一下,你的cookie被偷了......
这是我的解决方案:在用户表中创建另一行名为' userhash'。当用户登录时,您生成一个随机哈希而不进行任何输入,只是随机,并将其存储在表和cookie中。然后,您只需将userhash:timeout
存储在Cookie中。您可以针对数据库检查它是否存在,如果存在,则表明您的用户是否存在。当用户注销时,cookie和数据库中的行将被删除。出于显而易见的原因,您必须在比较之前检查cookie是否存在(会有很多空的)。
注意:此方法只允许一次注册一个cookie,因此没有笔记本电脑+桌面。这很好,因为窃取变得更加困难,因为只要真实用户没有登录就会持续,并且因为它只允许1台计算机而坏。但你看到了这个想法,以及你如何使用这种方法,但有多台计算机登录... facebook-like。
PD,如果你说你的应用程序必须实际上有多安全,那就太好了......
PD2,如果您还没有考虑过,还有其他更严重的安全问题(SSL就是一个)。