【发布时间】:2017-04-03 14:44:04
【问题描述】:
我正在处理忘记密码的页面,并试图找出最好的方法。目前,当用户访问该页面时,它会询问他们的电子邮件。该脚本检查该帐户是否存在,并向他们发送一封电子邮件,其中包含一个链接以单击以重置其密码。
该链接包含一个令牌(即md5(uniqid()))和当用户选择新密码时与数据库匹配的电子邮件地址。它将令牌存储在数据库表password_resets 中,以及从现在起 24 小时的到期日期以及他们帐户详细信息的外键。
当用户选择一个新密码时,它会将令牌与password_resets 表匹配,将电子邮件发送到该外键的电子邮件地址,并确保在设置新密码和删除记录之前,到期日期是将来的password_resets.
这是一种有效的方法吗?为此目的拥有一张完整的桌子似乎是多余的。有没有更好的方法?
【问题讨论】:
-
效率很高,应该没有问题。只需制作一个 cron 脚本来刷新过时的令牌。或者,您可以使用 JWT 令牌实现,这将消除对任何数据库的需求。
-
有点离题但
uniqid()does not generate cryptographically secure values 所以你应该考虑使用替代随机函数,例如openssl_random_pseudo_bytes() -
@this.lau_ 他们对
md5(uniqid())的使用并不是唯一使用uniqid()并且与密码学无关,它只是用作非常适合的唯一令牌。他们没有提及或可能不知道的是使用安全(密码)散列函数,例如password_hash()。我认为这个问题超出了他们发布的内容。所以是的,有点跑题了 ;-)openssl_random_pseudo_bytes()也可能无法在他们的服务器上使用。 -
@Fred-ii- 好点。澄清一下,我使用
password_hash()作为密码。 -
@Tomjr260 回答这个问题:我认为你想做的事情没有任何错误(逻辑)。这是一种(仍然)被广泛使用的方法。如果您认为额外的工作是值得的,那么它是;-)
标签: php mysql web forgot-password