1

我正处于一个项目的开始,当用户进行身份验证时,该项目将具有“记住我”选项。

我的用户的数据库表具有以下用于身份验证的基本结构:

  • id :用户注册时生成的随机数。(钥匙)
  • username :用户选择的用户名,可以更改为另一个唯一的用户名。
  • hash :设置密码时使用“phpass”创建的密码的哈希值。

我想知道一种使用 cookie 和 MySQL 让用户保持登录状态的安全方法,即使在多台计算机上也是如此。

我希望我可以使用相同的 cookie 来存储临时会话或“记住我”部分。我已经阅读了有关令牌以及将所有用户信息散列到 cookie 中的信息,但它安全吗?我检查了用户身份验证后使用的 Facebook cookie,并且有用户 ID 输入,我想做什么真的有必要吗?

如果我决定将信息散列到 cookie,我应该使用可能更慢的“phpass”还是简单的 MD5 函数,看到身份验证验证将出现在每个页面和每个 AJAX 请求中?每次验证登录时是否应该更新用户令牌?

最后,我最好的选择是什么?我知道有很多类似的问题,但我没有找到类似“最好的方法”来做到这一点。在每一篇文章中,我都发现这个主题有一些不同和矛盾的地方。我想知道一种安全干净的方法。

4

1 回答 1

2

我建议使用单独的表来存储已保存的登录会话。该表将存储用户选择“记住我”时生成的唯一哈希、用户的 IP 地址和他们的 user_id。

当或如果用户决定保持持久登录,您将生成散列,将该散列保存为 cookie 值,并将其 IP / user_id 存储在“已记住”表中。

在你的 session_start/check 序列中,首先检查是否设置了会话——如果没有,检查是否设置了 cookie——如果设置了 cookie,则将它们的 IP 地址与 cookie 的哈希值与数据库相匹配,然后如果全部签出,设置它们的会话状态为“已验证”。

使用其 IP 地址和唯一哈希的表的原因是允许多个设备/计算机保持不变。每个设备都会在您的 remembered_sessions 表中有一个条目。

此方法不会在 cookie 中存储任何密码,只有成功输入密码的人才会在其计算机上拥有此 cookie。此外,即使有人在他们的 cookie 中抓取了该用户的哈希值,他们也需要位于同一网络上才能被视为经过身份验证。

于 2012-11-06T21:05:44.633 回答