【发布时间】:2011-01-04 13:12:39
【问题描述】:
许多网站采用不同的方法,我很难决定哪种方法最适合我的网站。
我的用户配置文件包含以下数据:
username
password (in hash/digest form)
email
我希望密码重置方法安全、用户友好且高效。
【问题讨论】:
许多网站采用不同的方法,我很难决定哪种方法最适合我的网站。
我的用户配置文件包含以下数据:
username
password (in hash/digest form)
email
我希望密码重置方法安全、用户友好且高效。
【问题讨论】:
您应该添加两个字段,reset_code 和 reset_expiry
这是安全密码重置功能的过程。
用户选择“忘记密码”。
提示用户输入电子邮件/用户名。
如果有效,则生成一个 GUID,并将其存储在 reset_code 中,同时针对特定用户将 Now()+24 hours 存储在数据库中的 reset_expiry 中。
然后它会向该电子邮件地址发送一封电子邮件,其中包含确认密码重置的链接。此电子邮件将包含指向您网站的链接,其中包含用户的用户名和 reset_code 嵌入。 (这可以阻止恶意用户通过知道他们的电子邮件来重置第三方密码)
一旦用户点击电子邮件中的链接,他们将被定向到您的网站。 您的网站将验证:用户名和 reset_code 匹配,并且当前时间未超过 reset_expiry 时间。
如果一切正常,我们可以完成密码重置。这可以通过以下任一方式完成:
a) 在屏幕上显示一个随机生成的新密码
b) 通过电子邮件随机生成的新密码
c) 能够输入自己选择的密码
【讨论】:
{0,1,2,3,5,l},将所有内容小写,然后将[0,1,2,3,5,l] -> [o,i,z,b,s,i] 之类的映射应用于您从用户那里获得的密码。有“3”是因为在没有熟悉的上下文时,“B”经常被误认为“3”,其他的应该清楚。
您不应该存储用户的密码,即使是加密形式。您应该只存储身份验证所需的哈希/摘要。然后,您无法“恢复”密码(因为您不知道),您可以重置它,和/或给用户一个临时的一次性密码,允许他设置新密码。
更新:如果您执行上述操作,标准程序是有一个“要求密码重置”表格。用户输入他的 id(通常是他的电子邮件)并生成一个“令牌”(例如,一个随机字符串),存储在具有某个到期日期的某个表中,并连同指向“密码重置”的链接一起发送到他的电子邮件形式。在这种形式中,令牌被检查,用户被允许输入新密码,并被指示尝试新的登录。
更新 2:可能会出现一个小隐私问题:如果在请求表单中输入的用户 ID(电子邮件、用户名或其他)在我们的数据库中不存在,我们应该怎么做?输出消息 “用户不存在。检查 id 并重试。” 可能没问题,但在某些情况下会导致隐私问题:任何人都可以检查其他人是否在您的数据库中注册!如果您想避免这种情况,您必须输出相同的消息(“已发送带有说明的邮件...”),即使未找到用户(因此实际上并未发送邮件)。 类似的隐私问题建议在用户尝试登录失败时仅输出消息“登录不正确:用户或密码错误” - 不要透露用户或密码是否不正确。
【讨论】:
我同意 Leonbloy 的观点。存储密码会导致像几周前的 Gawker 事件一样的麻烦(发现并发布了 150 万个用户 ID/密码组合)。
但是,您应该有一个“重置密码”功能,可以将新密码通过电子邮件发送到用于开设帐户的原始电子邮件地址。
在密码重置期间不应更改电子邮件地址。如果用户无法再访问旧的电子邮件帐户,那就太糟糕了。放弃帐户并重新开始。
并在重置屏幕上使用良好的验证码。
【讨论】: