3

我目前正在完成一个网站,用户需要创建一个个人帐户才能玩托管在同一网站上的游戏。我目前难以弄清楚的是如何在忘记密码的情况下为用户实施安全密码重置功能。

这是目前实施的流程:

第 1 步:用户点击网站上的“忘记密码”链接。
第 2 步:用户进入表单并在发送电子邮件之前输入电子邮件地址两次。
第 3 步:电子邮件包含指向另一个表单的链接,用户可以在该表单中输入两次新密码以进行确认。输入第二种形式后,系统将一条新记录插入到数据库中的我的 Recover_Password 表中,该表包含“id”、“token”、“created_at”和“expires_at”列。

这是链接 -> (mywebsitename).com/form?id=99999&token=
其中“id”是用户的 id,“token”是从do_hash($id . date('Y-m-d'))

第 4 步生成的:用户完成表单并被带到登录页面。系统从数据库中清除令牌记录,并从用户表中更新用户的当前密码。

另外我想知道如果用户在第二种表单中尝试刷新浏览器页面该怎么办。我目前只允许在 get 参数中有 id 和 token 值并且它们都存在于数据库中的情况下访问该页面。

我在整个网站上使用 Codeigniter,需要知道这是否是一种安全的方法,以及我应该如何处理令牌和数据库。谢谢!!

4

1 回答 1

10

处理密码重置的安全方法如下所示:


密码重置请求:

  1. 用户打开密码重置请求表并输入电子邮件地址(无需输入两次,只需进行语法验证)。

  2. 您的应用程序检查电子邮件是否存在于您的数据库中。如果它存在,它会创建一个令牌,该令牌应该是随机的,而不是源自用户 ID 或时间戳等信息。令牌的哈希将与用户 ID 和到期日期一起存储在数据库中的单独表中。每封电子邮件都会将带有令牌的链接发送给用户。

  3. 该应用程序显示电子邮件已发送的确认信息。此页面可以包含电子邮件地址,因此用户可以检查他是否有错字(毕竟没有信息是否在数据库中,因此攻击者无法测试它的存在)。

重设密码:

  1. 用户单击链接并打开重置表单。在此表格上,他可以输入两次新密码。令牌必须作为隐藏的输入标签包含在表单中。

  2. 提交表单后,应用程序检查他的令牌。如果匹配且未过期,则可以更改密码并直接登录用户(您可以将登录表单留给他)。最后令牌应该被停用,我自己更喜欢保留条目,所以当他再次单击链接时,我可以通知用户令牌已被使用。

您将遇到的一个问题是,您必须在数据库中找到令牌的哈希值。有两种可能的方式来存储令牌:

  • 您可以使用不带盐的 SHA512 之类的哈希算法对令牌进行哈希处理。如果令牌非常强(最小长度为 20,AZ 为 0-9),这是安全的。从理论上讲,您必须在将此类哈希输入数据库之前检查它是否已经存在,实际上这可以忽略不计。我实现了一个可以处理此类令牌的密码重置类。

  • 您使用 BCrypt 和 salt 对令牌进行哈希处理。这允许更短的令牌,但您无法在数据库中搜索散列令牌。相反,您必须在链接中包含 row-id 才能找到令牌。

于 2013-08-20T09:18:07.620 回答