【问题标题】:What's a secure way to create a "remember me" system in PHP with cookies?使用 cookie 在 PHP 中创建“记住我”系统的安全方法是什么?
【发布时间】:2012-10-26 21:12:30
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: php mysql cookies


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我还建议将用户 ID 也存储在 cookie 中
    • 具有动态 IP 的连接存在问题
    • 如果您追求的是安全性,那是很小的代价。
    猜你喜欢
    • 2011-04-08
    • 2021-04-05
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2011-03-08
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多