2

我有一个存储加密密码的用户数据库,并想创建一个“让我登录”cookie。我相信以下方法对于我的目的应该足够安全,但我想听听您的想法:

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

如果有人要正确猜测信标字符串,则可以对其进行操作,但我的目的是使其足够大且足够随机,以至于很难做到。

4

3 回答 3

2

我认为这是在正常会话处理之外完成的,以作为稍后重新创建会话的方式。

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

  1. 使用 SSL,使 cookie 拦截变得更加困难。
  2. 每次使用后重新生成 cookie 哈希。它应该只对一次登录有效。
  3. 如果您将此作为 1 个 cookie 存储给 1 个用户,如果用户在多个设备上,它将不起作用(来自第一个设备的 cookie 被第二个设备上的 cookie 覆盖)。
  4. 哈希需要是随机的,不应在生成中包含任何用户数据。
  5. 用户数据(尤其是电子邮件、密码)应需要密码才能更改。如果 cookie 被拦截,拦截器将无法更改帐户上的数据。
于 2013-01-21T21:35:14.037 回答
0

我认为这不是实现“记住我”cookie 的最佳方式。使散列更大不是解决方案。

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

您建议这样做:

'a89bd752123cde09'

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

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

$userID . '-' . 'a89bd752123cde09

现在,他们需要获取与正确用户 ID 相关联的有效令牌,我们让它变得有点复杂

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

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

当您检查 cookie 时,将其解密并检查数据是否正确。

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

于 2013-01-21T21:50:55.167 回答
0

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

于 2013-01-21T21:38:40.127 回答