Security 查看我的设计:网站密码重置功能

Security 查看我的设计:网站密码重置功能,security,web-applications,Security,Web Applications,当有人丢失密码时,他们会单击“丢失或忘记密码”链接。 他们需要输入自己的电子邮件地址,然后回答自己的秘密问题 如果秘密问题是正确的,将向他们发送一封电子邮件,其中的链接在24小时后过期 发送电子邮件时,会在保存以下信息的数据库表中输入一条记录: -需要重置密码的人员的电子邮件 -密码重置将过期的小时数 -提交密码休息请求的时间 发送链接将引导用户进入一个表单,允许他们输入新密码。 在此表单中,他们需要输入电子邮件地址和密码 当他们单击submit时,会对db进行检查,以确保电子邮件有效(密码正在

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

发送电子邮件时,会在保存以下信息的数据库表中输入一条记录: -需要重置密码的人员的电子邮件 -密码重置将过期的小时数 -提交密码休息请求的时间

发送链接将引导用户进入一个表单,允许他们输入新密码。 在此表单中,他们需要输入电子邮件地址和密码

当他们单击submit时,会对db进行检查,以确保电子邮件有效(密码正在重置)且尚未过期(通过比较两个日期查看是否已过过期时间,即24小时)

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

成功时会发出确认消息

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

关于第二季度:

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

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

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

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


如有任何贡献或建议,我们将不胜感激。

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

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

  • 用户在“密码重置”表单中输入邮件地址
  • 邮件已验证(即数据库中是否有具有此邮件地址的用户?)
  • 新密码是随机生成并通过邮件发送的,然后经过salt/hash处理并保存到数据库中
  • 用户登录
  • 这很简单,也很普通,所以用户不会迷路

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

    • 设置密码重置比率。提交表单后,IP地址和提交的数据将被记住:现在,在几分钟内,来自同一IP地址的任何人都无法重置密码
    • 新生成的密码不会替换旧密码:相反,两者都可以使用。假设有人重置了另一个用户的密码。如果此用户尚未阅读或收到使用新密码的邮件,则必须仍然能够使用旧密码登录
    顺便说一句,但这只是我个人的意见,不要提供秘密问答功能,除非需要。我很难记住我在哪里回答了什么,因此忘记答案的风险可能比忘记密码的风险更大。

    最佳选择:

  • 通过OpenID让我登录。更少的编码复杂性,更少的点击,更少的打字,更少的时间浪费
  • 完成了。这个问题没有实际意义。不用再担心了,这个问题已经有人解决了
  • 有10亿个站点实施了10亿个身份验证方案,在99.999%的情况下这是不必要的。作为一个用户,我为什么要相信你作为一个开发人员不会将我的密码存储在纯文本中,或者泄露密码,或者自己被黑客攻击?很少有人对每个站点使用不同的密码

    如果不可能,则尽可能避免麻烦:

  • 我单击“忘记密码?”链接。如果我已经输入了电子邮件(例如,在尝试登录失败后),则会自动发送邮件。如果我没有输入密码,只需隐藏密码字段并告诉我这样做。不要重新加载或将我转发到其他页面
  • 我用一些键(例如
    https://site.com/account/reset?key=a890ea8219175f890b7c123ee74a22
    )。某个与我的帐户绑定的唯一散列,在某某几个小时后过期。尽可能使用SSL
  • 我点击链接,你通过密钥获取我的帐户详细信息,确保它有效且未过期。我输入了两次新密码。我已经知道我的电子邮件地址是什么,你也知道我的电子邮件地址是什么,任何想成为黑客的人都知道我的电子邮件是什么,所以不要让我输入。让链接持续一整天太过分了。在一小时或更短的时间内完成
  • 我讨厌安全问题。别问我这个。它基本上只是第二个密码,故意降低了安全性,所以你会永远记住它。我没有常客里程,我不知道我母亲的娘家姓等等。停下来。我知道这是为了防止陌生人入侵你的电子邮件,但除非你是PayPal,否则我认为这只是工程问题
  • 当您确认密码匹配并且可以接受时,请更新数据库(只存储我的密码的附加哈希,而不是密码本身!),并立即让我登录。不要把我转到第二个