查看我的设计:网站的密码重置工具

时间:2010-07-11 03:49:08

标签: security web-applications

当有人丢失密码时,他们会点击丢失或忘记的密码链接。 他们需要输入他们的电子邮件地址,然后回答他们自己的秘密问题 如果秘密问题是正确的,将向他们发送一封电子邮件,其链接将在24小时后过期。

发送电子邮件时,会在包含此信息的数据库表中输入记录: - 需要重置密码的人的电子邮件 - 重置密码的过期时间 - 提交密码请求的小时。

发送的链接会将用户引导至允许他们输入新密码的表单。 在这种形式下,他们需要输入他们的电子邮件地址和密码X2。

当他们点击提交时,会对数据库进行检查以确保电子邮件有效(密码正在重置)并且尚未过期(通过比较两个日期以查看过期时间是否已过去,这是24小时)

如果电子邮件有效且尚未过期,且两个密码匹配&满足最低要求,然后应用新密码。

成功时会显示​​确认消息。

Q1。这是密码恢复的好模型吗? Q2。如何确保发送到用户地址的链接是唯一的?在那个没有人会得到相同的链接?因此,没有人可以进入密码重置页面并尝试不同的电子邮件,而是需要重置的每个帐户都有自己唯一适用于该帐户的URL。

关于Q2:

我在想,当用户请求重置密码时,会生成一个随机唯一ID,并存储在24小时后过期的同一记录中。这个随机唯一id的列可以称为“rid”

将发送给用户的电子邮件中的链接将以?rid = xxxxxxxxxxxxx

结尾

当用户点击重置密码的页面中的提交时,页面顶部的“rid”用于从db获取相应的电子邮件地址,以将其与表单中的电子邮件地址进行比较。这样做可以确保每个密码重置案例都有自己唯一的URL,其他帐户无法使用该URL来重置其密码。

这是一个可行的解决方案吗?

任何意见或建议都将受到赞赏。

3 个答案:

答案 0 :(得分:6)

答案 1 :(得分:2)

Q1。恕我直言,有一个缺陷。为什么要求用户输入新密码?我宁愿生成一个新的随机密码并发送给他。收到后,用户可以使用此随机生成的密码登录,然后在他/她的个人资料中进行更改。

我建议在大多数网站上使用以下系统:

  1. 用户在“密码重置”表单中输入邮件地址。
  2. 邮件已经过验证(即数据库中是否有使用此邮件地址的用户?)
  3. 新密码是随机生成的,然后通过邮件发送,然后进行盐渍/散列并保存到数据库中。
  4. 用户登录。
  5. 这很简单,也很常见,因此用户不会丢失。

    现在,您可以通过以下方式提高安全性(减少滥用行为):

    • 设置密码重置比率。提交表单后,将记住IP地址和提交的数据:现在,几分钟内,来自同一IP地址的任何人都无法重置密码。
    • 新生成的密码不会替换旧密码:相反,两者都可以使用。想象一下有人重置了另一个用户的密码。如果用户未使用新密码阅读或接收邮件,则该用户仍必须能够使用旧密码登录。

    顺便说一句,但这只是我个人的意见,不提供秘密的问答功能,除非是必需的。我有太多的痛苦,记得我回答的地方,所以忘记答案比冒密码更容易冒险。

答案 2 :(得分:2)

首先,我建议您将密码重置视为安全的业务事务。 SSL on和单个请求独立于同一帐户的其他请求。生成随机的,不可重复使用的事务ID,并将其与此单一请求关联以进行密码重置。然后,在您发送给他们的电子邮件中,使用以下网址嵌入交易ID:

http://www.yoursite.com/passwordreset/?id=e3dXY81fr98c6v1

这种所谓的密码重置事务应该与帐户相关联,并且具有与密码重置相关联的元数据,例如请求日期和到期日期。帐户本身应该只知道存在/正在等待与之关联的密码重置。

此外,当用户要求重置密码时,请忘记密码问题 - 向他们发送您应该已经存档的电子邮件会更安全。 (如果你没有,那就开始收集它们了!) - 更好的是,使用他们的电子邮件地址作为用户名。

当用户从该交易ID URL输入新密码时,您相信它是您认为的那个人。为确保这一点,您只需要求他们重新输入用户名(您已确认自己正在使用的用户名)。