2013-03-05 109 views
4

当用户登录到我的站点时,它会创建2个Cookie,其中一个具有会话ID(与后端的用户ID相关)和一个记住我的Cookie,持续3个月。还记得我的cookie,需要一个会话cookie吗?

记住我的cookie被构造为:

userid:timeout:hash 

其中散列是userid:timeout一个HMAC SHA256哈希值,以防止篡改。

如果会话ID不存在(用户关闭浏览器并再次打开它,以使cookie不存在或者会话ID在memcached中不存在),它将查看记住的cookie并重新生成一个新的会话cookie ,假如它没有超时并且散列是正确的。

但是我根本没有看到拥有会话cookie的要点,因为会话ID只是指向后端的用户ID。我可以使用记住我的cookie来取回当前用户。

所以我想完全取消会话cookie,并有兴趣听到这方面的一些想法。这种方法听起来相对安全吗?我可以做得更好吗?

在此先感谢!

+0

任何人都可以计算SHA哈希值。你需要使用HMAC。 – SLaks 2013-03-05 15:16:14

+0

这是一个HMAC,将更新问题 – fire 2013-03-05 15:16:44

+2

您的用户没有选择不“记住我”?如果他们不想登录3个月会怎么样?他们必须注销?我可能是错的,但我觉得很多人依靠关闭浏览器来清除他们“不记得”的登录名 - 因为传统上这是如何完成的。 – 2013-03-05 15:20:55

回答

1

是的,对于大多数情况来说,它确实足够安全,但是为什么在cookie中包含用户特定的数据?此外,还有一个小缺点:

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

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

注意:此方法一次只允许一个注册的cookie,所以没有笔记本+桌面。这很好,因为窃取更加困难,因为只有真正的用户没有登录才会持续窃取,而且糟糕,因为它只允许1台计算机。但是你看到了这个想法,以及如何使用这种方法,但有几台计算机登录...类似Facebook。

PD,它会是不错的,如果你说如何保护您的应用程序必须是实际...

PD2,如果你还没有去想它,但还有其他更严重的安全问题(SSL说一个)。

+0

是的这是真的,虽然我试图避免写入数据库: -/ – fire 2013-03-05 16:15:13

+0

然后,我认为从用户名密码会好很多,因为密码可以很容易地更改而不会影响整个系统。 – 2013-03-05 16:26:18

+0

感谢您接受我实际上期待的其他答案,因为我基本上都在努力做同样的事情。 – 2013-03-07 04:01:31