Forgot Password: what is the best method of implementing a forgot password function?
我想知道在网站上创建忘记密码功能的最佳方法是什么。我已经看到了相当多的一些,这里有一些或是以下的组合:
- 密码问答(1个或多个)
- 使用新密码发送电子邮件
- 在屏幕上提供新密码
- 通过电子邮件确认:必须单击链接以获取新密码
- 要求用户输入新密码的页面
您将在忘记密码功能中添加哪些组合或附加步骤?我想知道他们是如何请求新密码的,以及他们是如何得到新密码的。
我的操作原则是无法检索密码;必须提供/生成新密码。
编辑我喜欢Cory所说的不显示用户名是否存在,但我想知道改为显示什么。我认为一半的问题是用户忘记了他们使用的电子邮件地址,显示某种"不存在"的消息是有用的。有什么解决办法吗?
选项1要容易得多。
一些重要的安全问题:
- 密码短语问答实际上降低了安全性,因为它通常是过程中最薄弱的环节。猜测某人的答案往往比密码更容易——尤其是如果问题没有被仔细选择的话。
- 假设电子邮件在您的系统中用作用户名(通常出于各种原因建议使用),对密码重置请求的响应不应指示是否找到有效的帐户。它应该简单地说明密码请求电子邮件已经发送到提供的地址。为什么?表示电子邮件确实存在/不存在的响应允许黑客通过提交多个密码请求(通常通过像burp套件这样的HTTP代理)并注意是否找到电子邮件来获取用户帐户列表。为了防止登录获取,您必须确保没有与登录/授权相关的功能提供有效用户电子邮件何时已输入登录/密码重置表单的任何指示。
有关更多背景信息,请查看Web应用程序黑客手册。这是一篇关于创建安全身份验证模型的优秀文章。
编辑:关于编辑中的问题-我建议:
"A password request email has been
sent to the address you provided. If
an email doesn't arrive shortly,
please check your spam folder. If no
email arrives, then no account exists
with the email you provided."
号
在易用性和安全性之间有一个权衡。您必须根据上下文来平衡这一点—安全性对您和您的用户来说是否足够重要以证明这一不便?
使用新密码发送电子邮件。
当他们到达时强制更改密码并输入新密码。
这确保了需要密码的人将是唯一进入帐户的人。
如果邮件被嗅探,有人可以进入账户(当然),但真正的一方会立即发现这一点(因为他们的密码,你刚刚发送他们不工作)。
同时向用户发送密码更改的确认信息。
如果有人得到了新密码,然后收到一封电子邮件,上面写着"更改密码的方法",他们会很困惑,如果不这样做,他们会和管理员交谈。
使用电子邮件验证/密码重置链接将为您提供更好的安全性。如果你环顾四周,大多数网站都是这样做的,而且人们已经很习惯了这种验证,所以我建议使用这种类型的验证。
我认为(GBrandt的)选项2是一个很好的方法,如果它与您已经为用户提供的一些个人信息相结合。即出生日期。
当用户通过输入电子邮件地址请求新密码(重置)时,他还必须在重置密码和向用户发送新密码之前输入正确的出生日期(或其他日期)。
只有那些很了解他的人才能通过重置他的密码来激怒他!它不能是陌生人或机器人
如果5或7个错误的电子邮件地址和出生日期组合,则会向用户发送电子邮件,告知其密码已被请求重置,并且由于凭据不正确而失败。然后,该帐户的密码重置将暂停24小时或任何所需时间段。
(如果有太多的用户就这封电子邮件与网站管理员联系,他会知道有人试图恶意从您的网站/应用程序获取信息)
你们觉得怎么样?
选项1。这不是一个好主意,因为一般情况下,他很容易被别人猜到。莎拉·佩林的个人电子邮件(我认为是雅虎)被第三方以这种方式入侵。
其他选项更好,以前的文章已经概述了细节。
我考虑的想法是在发送给用户的链接中签署数据。然后,当用户单击链接,服务器接收到调用时,服务器也会得到加密部分,并可以验证数据是否未被触及。
我已经为这个用例实现了一个Java项目。它在Github上,开源。它完美地回答了你的问题…用Java实现。
至于电子邮件中的链接,它会生成链接,并在使用时对其进行验证。
每件事都有解释(如果有什么遗漏-告诉我…)
请看:https://github.com/ohadr/authentication-flows
在这里看到一个演示。
这是使用auth流的客户机Web应用程序,其中包含自述文件和所有解释。它指导您实现:https://github.com/ohadr/oauth2-sample/tree/master/authentication-flows