【问题标题】:"Password forgot" Php system [closed]“密码忘记”Php系统[关闭]
【发布时间】:2015-09-23 22:12:53
【问题描述】:

哪种策略最适合恢复密码。 通过电子邮件向用户发送一个链接以创建新密码,覆盖当前密码?或者 通过电子邮件向用户发送一个随机生成的密码,然后要求他们更改?

【问题讨论】:

  • 基本上没关系。但我建议使链接或临时密码仅在短时间内有效。不过,这两种方式都不安全。如果注册的电子邮件被黑客入侵,他们将获得完全访问权限。我建议使用一个秘密问题的组合,并要求他们自己填写他们的电子邮件地址以发送它或其他东西。最后它仍然存在安全漏洞。但至少你可以尽可能地关闭它们。
  • 生成一个随机令牌并将其哈希存储在数据库中是要走的路。由于它不是从其他参数派生的,因此无法猜测,并且由于仅存储其哈希值,因此即使数据库泄漏也无法伪造。我试图在answer 中解释必要的步骤。

标签: php email passwords


【解决方案1】:

第一个。

创建一个表单来获取用户的电子邮件地址。

如果您的系统中不存在该用户,请向该地址发送一封电子邮件,说明“有人试图重置您的密码,但它不在我们的系统中”。

如果您的系统中确实存在该用户,请创建一个返回您网站的链接,并将该链接通过电子邮件发送给该用户。他们单击电子邮件中的链接并返回您的站点。

链接应如下所示:

https://example.com/reset-password?email=$usersEmail&hmac=$hmacOfTheirEmail

通过检查HMAC 确认电子邮件未被篡改。

为避免枚举用户,无论他们的电子邮件是否存在于您的系统中,都应从表单返回相同的响应。

取决于您的安全级别...

  • 让用户登录
  • 问他们一个或多个安全问题
  • 进行多重身份验证

然后强制用户更改密码

其他一些答案/网站建议将令牌存储在数据库中。问Mozilla这是怎么回事。

您可以向该链接添加一些其他参数,例如到期时间和 IP 地址。确保您也将它们包含在 HMAC 中。

为防止重放攻击,请在链接中包含用户旧(且已忘记)密码的哈希值。

【讨论】:

  • 您的 Mozilla 链接没有说明任何关于令牌的内容。他们遭到入侵(根据那篇文章),因为一名员工在另一个被黑客入侵的网站上重复使用了他的密码。
  • @developerwjk 修复了链接。
  • 听起来这与重载电子邮件地址有关,而不是与令牌有关。您的 hmac 方法不会修复 Mozilla 的错误,假设您先保存到 db 然后从 db 中的内容生成 hmac,因为电子邮件的截断已经发生,并且您已经相同的漏洞。
  • 最后,你做什么并不重要。除非您亲自认识每个用户,否则帐户安全性取决于用户。如果电子邮件帐户被盗用,这一切都无济于事。我个人会在每个帐户创建时创建一个令牌文件。在 x 次错误密码后锁定帐户并向用户发送一封电子邮件,告知他们的令牌文件将能够在 72 小时后解锁帐户,因此如果用户没有导致错误的密码尝试,用户有时间联系网站所有者。仍然不完美。如果令牌丢失了怎么办?等等等等。但是,最终安全性取决于帐户所有者。
  • 如果 Neil 提到替代提案为 DOSing 帐户提供了一种方法,那将会很有帮助。这里提供的解决方案也是一个坏主意,它容易受到重放攻击。使用过期的一次性密码而不是简单的哈希
猜你喜欢
  • 2012-05-03
  • 2014-09-02
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多