PHP Cookie 保持用户登录 - 这是否足够安全


PHP Cookie to keep user logged in - is this secure enough?

我有一个存储加密密码的用户数据库,并希望创建一个"保持登录"cookie。 我相信以下方法对于我的目的来说应该足够安全,但我想听听你的想法:

  1. 如果用户选择"保持登录状态"框并提供正确的凭据,请创建一个包含非常大的随机字符串的 cookie(称为信标)。 这也存储在用户表中的单独列中。
  2. 每次用户访问页面时, 在用户表中搜索信标 cookie. 如果它不存在,则什么都不做。 如果确实存在,请检索用户的信息并将其视为已登录。
  3. 当用户注销或未选中该框的情况下登录时, 销毁信标 cookie.

如果有人要正确猜测信标字符串,这可以纵, 但我的目的是让它足够大和随机,这很难做到.

我认为这是

在正常的会话处理之外完成的,以便稍后重新创建会话。

可以采取一些措施来提高安全性。

  1. 使用SSL,使cookie拦截更加困难。
  2. 每次使用后重新生成 Cookie 哈希。它只能对一次登录有效。
  3. 如果您将其存储为 1 个用户 1 个 cookie,则当用户在多个设备上时,它将不起作用(来自第一个设备的 Cookie 被第二个设备上的 cookie 覆盖)。
  4. 哈希必须是随机的,不应在生成中合并任何用户数据。
  5. 用户数据(电子邮件,特别是密码)应需要密码才能更改。如果 Cookie 被拦截,拦截器将无法更改帐户上的数据。

听起来您正在尝试从头开始重新创建会话。为什么不直接传递 session_set_cookie_params() 非常长的超时?

我认为这不是实现"记住我"cookie的最佳方式。使哈希更大不是解决方案。

想想在你的饼干中保存更多的东西。

你建议这个:

'a89bd752123cde09'

如果您有很多用户,也许获得有效令牌并不像您想象的那么困难

如果您只是将用户 ID 添加到此哈希...

$userID . '-' . 'a89bd752123cde09

现在,他们需要获取与正确用户ID关联的有效令牌,我们使其有点复杂

您也可以连接有关用户浏览器或会话的某些内容,并对其进行加密,可能是这样的:

hash_hmac('sha256', $userID . '-' . 'a89bd752123cde09' . '-' . md5(timeStamp when remember expires) . '-' . md5(browser user agent), A_SECRET_KEY);

当您检查cookie时,请对其进行加密并检查数据是否正确。

这不是最好的解决方案,但我认为它更好。有很多关于网络安全的信息,请阅读它,不要直接实现它。