使用cookie在PHP中创建“记住我”系统的安全方法是什么?

时间:2012-11-06 20:45:54

标签: php mysql cookies

我正处于项目的开头,当用户进行身份验证时,该项目会有“记住我”选项。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我建议使用单独的表来存储已保存的登录会话。此表将存储在用户选择“记住我”时生成的唯一哈希,用户的IP地址及其user_id。

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

在你的session_start / check序列中,首先检查会话是否已设置 - 如果没有,检查是否设置了cookie - 如果设置了cookie,则将其IP地址与cookie的哈希值相匹配,然后检查所有,将其会话状态设置为“已验证”。

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

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