2

我知道这个问题可能会被问很多次,但他们中的大多数人建议你存储 ip+username+password 并散列整个事情并进行比较,相反我为我的网站想出了一个不同的解决方案,我想做这样的事情:

正在使用会话存储用户名、用户 ID、时区偏移等,现在假设我们说用户登录并且他检查了记住我,我将设置会话,然后我将生成一个变量 uniqueid 保存随机 12-13 位数字 ID,之后设置这个我将在他的浏览器上使用这个唯一的 ID 和用户名创建一个 cookie,并将其存储在我的数据库中,当他回来时,我会检查是否设置了该 id 和用户名 cookie,如果是,而不是从数据库中选择用户名,remembermeid其中用户名 = cookie 用户名,然后再次设置会话并将他扔到主页上,否则重定向到登录页面..

如果他注销,我将删除所有 cookie,并在他选择记住并登录后更新唯一值...

这样做有什么问题吗?还是更好的方法?我不希望密码保存在 cookie 中,即使是散列状态..或者我在做什么是完美的?

4

2 回答 2

3

因此,据我了解您的描述,当用户登录(并希望保持永久登录状态)时,您执行以下操作:

  • 创建一个随机令牌。
  • 将随机令牌保存在该用户的用户数据库记录中(或保存在包含用户名和令牌的单独表中)。
  • 在包含用户名和令牌的用户浏览器上设置 cookie。

当用户返回并且没有活动会话,但确实设置了上面的 cookie 时,您在数据库中查找他们的用户名。如果数据库包含该用户的“记住我”令牌,并且该令牌与 cookie 中的令牌匹配,则您为该用户创建一个新会话。

当用户注销时,您会从他们的浏览器中删除 cookie,并从数据库中删除令牌。


如果是这样,这是一个非常安全的设计,只要令牌足够长并且由安全的随机数生成器生成(如/dev/urandom在 Unix 上)。您说您的令牌是“12-13 位长”,相当于 40 位多一点;这有点偏低,我建议至少两倍。另外,您没有说明您是如何生成令牌的;仅使用 PHPrandmt_rand不安全,因为它们的输出可能是可预测的。

我还建议进行两项改进:首先,在将令牌存储到数据库之前对其进行哈希处理(任何加密哈希函数都可以,例如 SHA-1 - 对于长随机令牌,您不需要任何特殊的密码哈希函数,如 PBKDF2)所以设法复制数据库的攻击者不会获得所有令牌。其次,在数据库中包含令牌的到期日期,以便单个受损令牌不会永远保持有效。

于 2012-09-09T08:33:00.513 回答
1

您永远不必在 cookie 中存储用户名和/或密码。您只需要存储一个唯一标识符(随机生成),它可以与数据库中的散列会话标识符进行比较。

于 2012-09-09T08:10:33.143 回答