我是 PHP 新手,到目前为止创建了一个登录、注册和忘记密码,目前用户是从 MySQL 表中发送密码的。我现在已经使用 sha1 加密了密码。我目前正在编写代码:
当用户点击忘记密码链接时,他们输入用户名和电子邮件地址(已验证)。
我目前发现很难在已发送的电子邮件中向他们发送 url 链接以将他们引导到要重置的页面。
任何帮助将不胜感激(代码片段、教程、方法链接等。)
塔
您甚至不应该存储用户密码的(未加盐的)哈希值:您应该首先生成一个随机字符串(“盐”),将其与密码连接,对结果进行哈希处理(使用 SHA1 或您喜欢的任何算法)并存储数据库中的哈希和盐。如果攻击者能够访问您数据库中的哈希值,这将击败预先计算的字典(“彩虹表”)攻击。
完成此操作后,您也不应该将用于密码重置的临时令牌存储在数据库中:如果攻击者可以访问您的用户表,他们只需要填写您的“我忘记密码”表格并从数据库,以便在没有看到生成的电子邮件的情况下重置该用户的密码。因此,令牌被称为“密码等价物”,应该以与密码本身完全相同的方式进行保护:加盐和散列。
存储了重置令牌的加盐哈希后,您现在可以在 URL 的查询字符串中向您的用户发送带有用户 ID 和重置令牌的链接,例如http://www.example.com/resetpassword.php?user=235747&token=347659864124567532256
.
在点击该链接后,提供的用户和令牌将可用于您的 PHP 脚本,如$_GET['user']
和$_GET['token']
; 然后,您可以从数据库中检索盐,与提供的令牌连接,计算预期的哈希值并与数据库记录中的哈希值进行比较。如果它们匹配,则您确信用户收到了您发送的电子邮件,然后您可以提示他们输入所需的新密码。