这是创建重置密码的链接的最佳做法?

时间:2012-08-10 09:52:01

标签: php passwords forgot-password change-password

我在网站上有用户,他们的密码是加密的(md5)并存储在数据库中。现在,我收到了他们的电子邮件,如果有人忘记了密码,我想给他发送链接以重置密码。

任何人都可以建议如何做到这一点?哪些是最佳做法?

的问候,卓然

4 个答案:

答案 0 :(得分:2)

您应该使用mail()发送电子邮件,并在数据库中添加哈希随机字符串。电子邮件应包含“domain.com/forgot.php?h=HASHEDSTRING”之类的链接。在该页面中,您应该检查哪个用户具有该哈希字符串,并为其输出一个字段以重置其密码。

答案 1 :(得分:1)

在数据库中弹出一个相当独特的列,它是一个随机生成的令牌字符串(很长)。当用户请求重置密码时,请将该令牌发送到电子邮件中以进行验证。通过链接(又名GET)返回该令牌将确认用户可以访问该电子邮件地址,并在此时允许他们重置其密码。

答案 2 :(得分:1)

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

密码重置请求:

  1. 用户打开密码重置申请表并输入电子邮件地址。
  2. 您的应用程序会检查您的数据库中是否存在该电子邮件。如果它存在,它会创建一个令牌,该令牌应该是随机的,而不是来自诸如userid或timestamp之类的信息。令牌的哈希将与用户ID和有效期一起存储在数据库中的单独表中。每封电子邮件都会向用户发送包含原始令牌的链接。
  3. 该应用程序显示已发送电子邮件的确认。此页面可以包含电子邮件地址,因此用户可以检查他是否有拼写错误(毕竟没有关于电子邮件是否在数据库中的信息,以便攻击者无法测试其存在)。
  4. 密码重置:

    1. 用户点击该链接并打开重置表单。在此表格上,他可以输入两次新密码。必须将令牌作为隐藏输入标记包含在表单中。
    2. 提交表单后,应用程序会对令牌进行哈希处理,并在数据库中搜索这样的令牌哈希值。如果匹配且未过期,则可以允许用户更改密码。最后,令牌应该被标记为已使用,我自己更喜欢保留该条目,因此当他再次点击该链接时,我可以通知用户该令牌已被使用。
    3. 您可以使用SHA512之类的哈希算法对令牌进行哈希处理,而不使用盐。如果令牌非常强大(最小长度为20,0-9 a-z A-Z),这是安全的。从理论上讲,你必须先检查这种哈希是否已经存在,然后才能在数据库中输入,实际上这可以忽略不计。

答案 3 :(得分:0)

您可以执行以下操作,

  1. 如果用户忘记了密码,则允许他输入已注册的电子邮件。

  2. 发送包含重置密码链接的电子邮件,该链接应包含md5(部分数据) 例如:www.ex.com/md5_data

  3. 在发送邮件之前,输入的支票邮件是存在的,如果存在,则使用用户ID,存储用户ID,md5(数据)以及邮件发送

  4. 当用户点击发送给邮件的链接时,获取url数据并检查表中是否存在md5数据,如果存在则获取用户ID并允许他设置新密码并使用用户ID更新密码并删除来自表格的md5数据,如果他再次点击链接则不应该有效。