53

我想知道在网站上创建忘记密码功能的最佳方法是什么。我已经看到了很多,这里有一些或组合:

  • 密码短语问题/答案(1 个或多个)
  • 使用新密码发送电子邮件
  • 在屏幕上输入新密码
  • 通过电子邮件确认:必须单击链接以获取新密码
  • 要求用户输入新密码的页面

您会为忘记密码功能添加哪些组合或附加步骤?我想知道他们如何请求新密码以及他们最终如何获得它。

我操作的主体是无法找回密码;必须提供/生成新密码。

编辑我喜欢科里所说的不显示用户名是否存在,但我想知道要显示什么。我在想问题的一半是用户忘记了他们使用的电子邮件地址,显示某种“不存在”消息很有用。有什么解决办法吗?

4

7 回答 7

48
  1. 我个人会发送一封电子邮件,其中包含一个短期页面的链接,可以让他们设置新密码。使页面名称成为某种 UID。
  2. 如果这对您没有吸引力,那么向他们发送一个新密码并强制他们在首次访问时更改它也可以。

选项1要容易得多。

于 2009-02-07T02:15:52.813 回答
25

几个重要的安全问题:

  • 密码短语问题/答案实际上会降低安全性,因为它通常会成为流程中最薄弱的环节。猜测某人的答案通常比密码更容易——尤其是在没有仔细选择问题的情况下。
  • 假设电子邮件在您的系统中作为用户名运行(出于各种原因,通常建议这样做),对密码重置请求的响应不应表明是否找到了有效帐户。它应该简单地说明密码请求电子邮件已发送到提供的地址。为什么?指示电子邮件存在/不存在的响应允许黑客通过提交多个密码请求(通常通过诸如 burp 套件之类的 HTTP 代理)并注意是否找到电子邮件来获取用户帐户列表。为了防止登录收集,您必须确保没有登录/身份验证相关功能提供任何指示何时在登录/密码重置表单上输入了有效用户的电子邮件。

有关更多背景信息,请查看 Web 应用程序黑客手册。这是一本关于创建安全身份验证模型的优秀读物。

编辑:关于您编辑中的问题 - 我建议:

“密码请求电子邮件已发送到您提供的地址。如果电子邮件没有很快到达,请检查您的垃圾邮件文件夹。如果没有电子邮件到达,那么您提供的电子邮件不存在帐户。”

这里需要在易用性和安全性之间进行权衡。您必须根据上下文来平衡这一点 - 安全性对您和您的用户来说是否足够重要以证明这种不便是合理的?

于 2009-02-07T04:44:16.523 回答
8

使用新密码发送电子邮件。

当他们到达并输入新密码时,强制更改密码。

这确保了想要密码的人将是唯一进入该帐户的人。

如果电子邮件被嗅探,有人可以进入该帐户(当然),但真正的一方会立即发现这一点(因为您刚刚发送给他们的密码不起作用)。

还向用户发送密码更改确认。

如果有人收到新密码,然后收到一封电子邮件说“感谢更改密码”,他们会很困惑,如果他们没有这样做,他们会与管理员交谈。

于 2009-02-07T02:15:38.150 回答
2

使用电子邮件验证/密码重置链接将为您提供更好的安全性。如果您环顾四周,这就是大多数网站的做法,而且人们已经习惯了这种验证,所以我建议使用这种类型的身份验证。

于 2009-02-07T02:25:21.890 回答
1

我认为(gbrandt 的)选项 2 将是一个很好的方法,如果它与您已经为用户拥有的一些个人信息相结合。即出生日期。

当用户通过输入他的电子邮件地址请求新密码(重置)时,他还必须在密码重置之前输入正确的出生日期(或其他内容)并将新密码通过电子邮件发送给用户。

只有熟悉他的人才可能会通过重置他的密码来惹恼他!它不能是陌生人或机器人

在 5 或 7 个错误的电子邮件地址和出生日期组合时,用户会收到电子邮件,要求重置其密码,但由于凭据不正确而失败。然后该帐户的密码重置将暂停 24 小时或任何所需的时间。

(如果有太多用户就这封电子邮件联系网络管理员,他会知道有人正试图从您的网站/应用程序恶意获取信息)

你们有什么感想?

于 2010-08-31T18:43:28.040 回答
0

选项 1.不是一个好主意,因为通常他很容易被其他人猜到。Sarah Palin 的个人电子邮件(我认为是雅虎)被第三方以这种方式入侵。

其他选项更好,以前的帖子已经概述了细节。

于 2009-02-07T02:24:46.400 回答
-1

我正在考虑的想法是对发送给用户的链接中的数据进行签名。然后,当用户单击链接并且服务器接收到调用时,服务器也会获取加密部分并可以验证数据未被触及。

我已经为这个用例实现了一个 JAVA 项目。它在 GitHub 上,开源。它完美地回答了您的问题……用 Java 实现。

至于电子邮件中的链接- 它会生成链接,并在使用时对其进行验证。

对所有事情都有解释(如果缺少某些东西 - 让我知道......)

看看:https ://github.com/OhadR/Authentication-Flows

在此处查看演示

这是使用 auth-flows 的客户端 web 应用程序,带有所有解释的 README。它指导您实施:https ://github.com/OhadR/authentication-flows/tree/master/authentication-flows

于 2014-01-19T15:05:53.893 回答