【问题标题】:PHP password recoveryPHP密码恢复
【发布时间】:2011-06-13 10:02:55
【问题描述】:

我意识到为了安全起见,密码不应以明文形式存储在数据库中。如果我散列它们,我可以验证它们以用于登录目的。

但是如果我想建立一个密码恢复系统,最好的策略是什么,因为没有撤消散列?

有人可以简要介绍一下用于存储和恢复密码的良好且安全的策略吗?

【问题讨论】:

标签: php passwords


【解决方案1】:

我的流程如下。

1。用户发起忘记密码请求

用户单击忘记密码的链接,然后被重定向到重置密码表单,要求他们输入注册的电子邮件地址。

2。已验证电子邮件地址并生成令牌

用户输入他们的电子邮件地址后,系统会验证它是否存在于数据库中。如果电子邮件地址有效,则会生成一个令牌并将其与用户凭据一起存储在数据库中。

3。发送辅助邮件

一封电子邮件被发送到包含重置表单链接的注册电子邮件地址,该链接包括 2 个 GET 参数,包括令牌和存储在数据库中的用户唯一 ID。

4。重置密码

在用户点击链接后,他们将被带到重置表单。系统从 URL 中检索 2 个 GET 参数并验证它们是否存在于数据库中。如果验证令牌与用户一起存在于数据库中,则可能会向用户显示重置密码表单字段以输入新密码。

安全

我建议使用 BCrypt(自 PHP 5.3 起可用)来对密码进行哈希处理并为了提高安全性,或许可以对令牌使用某种到期时间,以便在一段时间后无法使用它。

【讨论】:

  • 并且只在数据库中存储令牌的哈希值,否则具有数据库读取权限的攻击者(SQL 注入)可以要求重置他想要的任何电子邮件,因为他可以读取他可以劫持帐户的新令牌。
  • 如果你有 SQLi 漏洞,你有更大的顾虑。
【解决方案2】:

您无法恢复经过哈希处理的密码,您也不应该这样做。

你应该做的是:

  1. 对密码重置请求进行一些验证,例如 CAPTCHA。
  2. 创建一次性随机代码并将其链接发送到用户的电子邮件。
  3. 让此代码在一个小时后过期。
  4. 此代码在使用后立即过期。
  5. 在带有密码的链接上,如果验证成功,请允许他更改密码。
  6. 通知他密码已更改,但不要在电子邮件中发送。

【讨论】:

  • 绝对同意 100%。切勿在电子邮件中发送任何密码(即使是临时密码)。诚然,一次性密码和密码一样好用,但你还能做什么......
  • 代码只在有限的时间内和密码一样好,这降低了它的危险性。
  • 如果,比方说 Alice,使用“假”电子邮件 (bob89fake@hotmail.com) 注册到您的网站 (website.com)。好吧,bob89fake@hotmail.com(又名 Bob)是一个现有的 hotmail 帐户,所有者是一个坏的、聪明的和活跃的人。 Bob 看到了一个机会并使用他收到的激活链接激活 Alice 的帐户。 Bob 是个坏孩子,他真的很想登录 Alice 的 website.com 帐户,而且他知道该怎么做。 Bob 要求密码请求,填写自己的电子邮件地址,发送请求,接收激活链接,单击此链接,更新 Alice 的密码。最后,Bob 可以登录了。
  • @Marc-AndréFecteau 这就是为什么您永远不应该使用可能由其他人创建的真实域和帐户发送虚假电子邮件的原因。而是使用随机长密码创建一个 gmail 帐户,一旦完成,您就可以丢弃密码。当然,如果您需要恢复网站的密码,那您就有麻烦了 :)
  • 第5步:是否可以只为用户生成一个新密码并显示在页面上,这样需要的步骤更少?
【解决方案3】:

您不会“恢复”密码。您所做的是两件事之一。

  1. 通过电子邮件向用户发送创建新密码的链接,覆盖当前密码
  2. 通过电子邮件向用户发送随机生成的密码,然后要求他们更改密码

【讨论】:

    【解决方案4】:

    您可以为用户创建一个新的(随机生成的)密码,然后 md5 它,然后通过电子邮件发送给用户。

    【讨论】:

    • 通过电子邮件发送密码是个坏主意,因为许多人几乎永远存储电子邮件并且信息可能会泄露。
    • @Stasm:他的意思是临时密码。然后用户登录进行更改。
    • @StasM:这就是为什么您告诉用户在使用这个随机生成的密码登录后更改密码。
    • @Stasm,这个密码当然是临时密码。并且必须由用户更改。
    • @webbiedave 如果我更改密码而不是他怎么办?
    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 2015-11-12
    • 1970-01-01
    • 2010-11-30
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多