许多网站实施不同的方法,我很难决定哪种方法最适合我的网站。
我的用户个人资料包含以下数据:
username
password (in hash/digest form)
email
我希望密码重置方法安全,用户友好且高效。
答案 0 :(得分:8)
您应该添加两个字段,reset_code和reset_expiry
这是安全密码重置功能的过程。
用户选择“忘记密码”。
提示用户输入电子邮件/用户名。
如果有效,则生成GUID,并将其存储在reset_code中,并在数据库中的reset_expiry中针对该特定用户存储Now()+ 24小时。
然后它会向电子邮件地址发送一封电子邮件,其中包含确认密码重置的链接。此电子邮件将包含指向您网站的链接,其中包含用户的用户名AND reset_code。 (这可以阻止恶意用户仅通过了解他们的电子邮件重置第三方密码)
用户点击电子邮件中的链接后,系统会将其定向到您的网站。 您的网站将验证:用户名和reset_code匹配,当前时间未超过reset_expiry时间。
如果一切正常,我们可以完成密码重置。这可以通过以下任一方式完成:
a)屏蔽新的随机生成的密码
b)通过电子邮件随机生成的新密码
c)输入他/她自己选择的密码的能力
答案 1 :(得分:7)
您不应存储用户的密码,甚至不应以加密形式存储。您应该只存储身份验证所需的哈希/摘要。然后,你无法“恢复”密码(因为你不知道它),你可以重置密码,和/或给用户一个临时的一次性密码,允许他设置一个新密码。
更新:如果您正在执行上述操作,则标准过程是使用“require-password-reset”表单。用户输入他的id(通常是他的电子邮件)并生成“令牌”(例如,随机字符串),存储在具有一些到期日期的某个表中,并且发送到他的电子邮件以及到“密码重置”的链接。形成。在此表单中,将检查令牌,允许用户输入新密码,并指示尝试新登录。
更新2 :可能会出现一个小小的隐私问题:如果我们的数据库中不存在请求表单中输入的用户ID(电子邮件,用户名或其他内容),我们该怎么办?要输出消息“用户不存在。检查ID并重试。”可能没问题,但在某些情况下会导致隐私问题:任何人都可以检查是否有其他人在您的数据库中注册!如果你想避免这种情况,你必须输出相同的信息(“邮件已经发送了说明......”),即使没有找到用户(因此实际上没有发送邮件)。 当用户尝试登录失败时,类似的隐私问题建议只输出消息“登录错误:错误的用户或密码” - 不要透露是否是不正确的用户或密码。
答案 2 :(得分:0)
我同意Leonbloy的观点。存储密码会导致像几周前Gawker事件一样的麻烦(发现并发布了150万用户ID /密码组合)。
但是,您应该有一个“重置密码”功能,可以将新密码通过电子邮件发送到用于打开帐户的原始电子邮件地址。
在密码重置期间,不应更改电子邮件地址。如果用户再也无法访问旧的电子邮件帐户,那就太糟糕了。放弃帐户并重新开始。
在重置屏幕上使用好的验证码。