当有人丢失密码时,他们会点击丢失或忘记的密码链接。 他们需要输入他们的电子邮件地址,然后回答他们自己的秘密问题 如果秘密问题是正确的,将向他们发送一封电子邮件,其链接将在24小时后过期。
发送电子邮件时,会在包含此信息的数据库表中输入记录: - 需要重置密码的人的电子邮件 - 重置密码的过期时间 - 提交密码请求的小时。
发送的链接会将用户引导至允许他们输入新密码的表单。 在这种形式下,他们需要输入他们的电子邮件地址和密码X2。
当他们点击提交时,会对数据库进行检查以确保电子邮件有效(密码正在重置)并且尚未过期(通过比较两个日期以查看过期时间是否已过去,这是24小时)
如果电子邮件有效且尚未过期,且两个密码匹配&满足最低要求,然后应用新密码。
成功时会显示确认消息。
Q1。这是密码恢复的好模型吗? Q2。如何确保发送到用户地址的链接是唯一的?在那个没有人会得到相同的链接?因此,没有人可以进入密码重置页面并尝试不同的电子邮件,而是需要重置的每个帐户都有自己唯一适用于该帐户的URL。
关于Q2:
我在想,当用户请求重置密码时,会生成一个随机唯一ID,并存储在24小时后过期的同一记录中。这个随机唯一id的列可以称为“rid”
将发送给用户的电子邮件中的链接将以?rid = xxxxxxxxxxxxx
结尾当用户点击重置密码的页面中的提交时,页面顶部的“rid”用于从db获取相应的电子邮件地址,以将其与表单中的电子邮件地址进行比较。这样做可以确保每个密码重置案例都有自己唯一的URL,其他帐户无法使用该URL来重置其密码。
这是一个可行的解决方案吗?
任何意见或建议都将受到赞赏。
答案 0 :(得分:6)
答案 1 :(得分:2)
Q1。恕我直言,有一个缺陷。为什么要求用户输入新密码?我宁愿生成一个新的随机密码并发送给他。收到后,用户可以使用此随机生成的密码登录,然后在他/她的个人资料中进行更改。
我建议在大多数网站上使用以下系统:
这很简单,也很常见,因此用户不会丢失。
现在,您可以通过以下方式提高安全性(减少滥用行为):
顺便说一句,但这只是我个人的意见,不提供秘密的问答功能,除非是必需的。我有太多的痛苦,记得我回答的地方,所以忘记答案比冒密码更容易冒险。
答案 2 :(得分:2)
首先,我建议您将密码重置视为安全的业务事务。 SSL on和单个请求独立于同一帐户的其他请求。生成随机的,不可重复使用的事务ID,并将其与此单一请求关联以进行密码重置。然后,在您发送给他们的电子邮件中,使用以下网址嵌入交易ID:
http://www.yoursite.com/passwordreset/?id=e3dXY81fr98c6v1
这种所谓的密码重置事务应该与帐户相关联,并且具有与密码重置相关联的元数据,例如请求日期和到期日期。帐户本身应该只知道存在/正在等待与之关联的密码重置。
此外,当用户要求重置密码时,请忘记密码问题 - 向他们发送您应该已经存档的电子邮件会更安全。 (如果你没有,那就开始收集它们了!) - 更好的是,使用他们的电子邮件地址作为用户名。
当用户从该交易ID URL输入新密码时,您相信它是您认为的那个人。为确保这一点,您只需要求他们重新输入用户名(您已确认自己正在使用的用户名)。