【问题标题】:How can I securely provide a user with a new password in a PHP/MySQL web application?如何在 PHP/MySQL Web 应用程序中安全地为用户提供新密码?
【发布时间】:2011-07-19 05:04:22
【问题描述】:

我有一个简单的问题。为用户恢复密码的最佳方法是什么?

我希望用户能够单击“忘记密码?”之类的链接。点击后,用户将收到一封包含新密码的电子邮件。

我认为发送哈希是一个不好的选择,那么我必须生成一个随机密码,转换为哈希+随机盐,在数据库中替换它并通过电子邮件发送新的随机密码。这是最好的方法,还是有其他方法?越简单越好。

谢谢!

【问题讨论】:

    标签: php mysql hash passwords


    【解决方案1】:

    我会做以下事情

    1. 用户请求密码重置
    2. 用户输入用户名或密码
    3. 向用户发送一封电子邮件,其中包含一个带有唯一哈希的链接,该链接位于数据库表中(例如 pwrecovery) - 此链接类似于:http://domain.com/pwrecover.php?key=KEYHERE
    4. 用户单击该链接,如果哈希值存在于表中,则他们会收到另一封包含新密码的电子邮件。

    这样,用户在收到正确的电子邮件时不会发现他们的密码被随机用户更改。

    【讨论】:

    • 伙计,我认为带有新随机词的简单电子邮件(如果用户愿意,他可以在第一次登录时更改密码),没关系。
    • 但是如果我得到一个用户的电子邮件地址,我可以每天重置他们的密码,他们所能做的就是更改他们的电子邮件地址来阻止我这样做。
    【解决方案2】:

    您应该通过电子邮件发送一个指向带有安全问题的页面的链接(以及防止人们获取其他人的安全问题的唯一代码)。

    回答问题后,允许用户创建新密码。

    【讨论】:

      【解决方案3】:

      最安全的方法是通过电子邮件向此人发送指向允许他们创建新密码的页面的链接。密码只能存储为加盐哈希。破坏这个过程需要一个人的电子邮件被泄露——在这种情况下,他们可能会遇到比你的 web 应用程序密码泄露更严重的问题。


      文件和表格:

      我想您的数据库包含一个名为“users”的表,其中一个名为“userid”的列用作其主键。

      1. 在您的数据库中创建一个名为password_reset 的新表,其中包含三列:userid,它是指向表users 的外键; code,它将包含一个唯一的随机数;和timestamp,它将包含发出请求的日期。

      2. 创建一个密码重置页面,例如password_reset_request.php。要求提供用户名或电子邮件。

      3. 创建一个用于设置新密码的页面,例如set_new_password.php

      逻辑:

      1. 如果提供给password_reset_request.php 的用户名或电子邮件有效,则在password_reset 表中插入与请求对应的行。假设用户 Fel 提出了密码重置请求。 Fel 的内部 userid 可能是 564979password_reset 中的行大致如下:564979, 54c4a2767c2f485185ab72cdcf03ab59, 2011-01-01 12:00:00

      2. 向用户的电子邮件地址发送一封电子邮件,其中包含如下所示的 URL:http://your.url/set_new_password.php?userid=564979&code=54c4a2767c2f485185ab72cdcf03ab59

      3. set_new_password.php 被点击时,它应该检查URL 中是否存在useridcode 属性。不在那里? 中止。

      4. 清理useridcode 属性(如果它们存在)。这很重要。

      5. 运行如下 SQL 命令:SELECT * FROM password_reset pr WHERE pr.userid = $userid AND pr.code = $code AND TIMESTAMPDIFF(DAY, CURTIME(), pr.timestamp) < 1

      6. 如果您没有收到任何结果,中止。

      7. 如果收到结果,请允许用户输入新密码。

      8. 按照注册时的常规验证密码后,使用 SQL UPDATE 语句更改用户密码。

      9. 使用 SQL 从password_reset 表中删除对用户的所有请求:DELETE * FROM password_reset WHERE userid = $userid

      你已经完成了!

      【讨论】:

      • 如果我错了,请纠正我。您的建议是,用户发布您的电子邮件或用户名,然后发送一封电子邮件,其中包含用户可以创建新密码的链接。我如何创建链接?过程是什么?是随机链接吗?谢谢
      • 这对我来说似乎很复杂。你知道任何网络教程或类似的东西吗?谢谢西里翁
      • 这个比较简单;我从未见过有关它的网络教程。我将再次编辑我的答案以使其更加清晰。
      • 你去!我已经大大扩展了细节。
      • 我真的很感谢你的帮助,很好的解释。我会试试的,谢谢
      猜你喜欢
      • 2013-06-13
      • 1970-01-01
      • 2011-02-24
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多