【问题标题】:Remember me cookie, need for a session cookie?记住我的 cookie,需要会话 cookie 吗?
【发布时间】:2013-02-20 01:30:47
【问题描述】:

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

记住我的 cookie 构造如下:

userid:timeout:hash

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

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

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

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

提前致谢!

【问题讨论】:

  • 任何人都可以计算 SHA 哈希。您需要使用 HMAC。
  • 这是一个HMAC,会更新问题
  • 您的用户无法选择不“记住我”?如果他们不想在 3 个月内登录怎么办?他们必须退出?我可能是错的,但我觉得很多人依靠关闭浏览器来清除他们“未记住”的登录信息——因为传统上是这样做的。
  • 是的,点击“退出”并非不合理。您没有选择不在 StackOverflow 上保持登录状态 ;-)
  • 您应该尽可能重用现有的身份验证框架,因为它确实很复杂。比如看看github.com/delight-im/PHP-Auth

标签: php session cookies security


【解决方案1】:

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

如果用户设法从其他用户那里窃取 cookie,您必须更改生成 cookie 的整个方式,否则该用户将始终有权访问,因此会重置每个用户的 cookie。现在想象一下,被盗的是你的 cookie……

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

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

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

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

【讨论】:

  • 是的,虽然我试图避免写入数据库:-/
  • 那么我认为从用户 ID 和密码中获取哈希值会更好,因为可以轻松更改密码而不会损害整个系统。
  • 感谢您的接受,实际上我期待其他答案,因为我基本上是在尝试做与您相同的事情。
  • 我已经采用了 userhash 的想法,将其存储在 memcache 中,然后最终存储在数据库中。当它是一个后端存储时,它会更加安全。
  • 我想是的,为了使其安全并防止彩虹表攻击,就是存储盐,这在数据库交互方面是一样的
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 2018-01-20
  • 2011-03-22
  • 2012-12-04
  • 1970-01-01
  • 2017-06-04
  • 2013-01-03
  • 2012-07-10
相关资源
最近更新 更多