PHP - 如何实现密码重置和令牌到期

mar*_*mcw 17 php

我想设置一个php密码恢复脚本,使用24小时后过期的令牌.但我不知道该怎么做.我目前已经SHA1加密了用户密码.我想要做的就是在URL上添加一个令牌,当他们请求重置密码时,该URL会发送给用户.但是我该如何正确地做到这一点以及我需要在数据库中存储什么?

Bol*_*ock 36

  1. 当您的用户请求重置密码时,生成令牌并计算其到期日期
  2. 将令牌及其到期日期存储在该用户的users表的不同列中
  3. 向包含重置链接的用户发送电子邮件,并将令牌附加到其URL
  4. 当您的用户关注该链接时,请从您的网址获取令牌(可能是$_GET['token'])
  5. 根据您的users表验证令牌
  6. 检查它是否还没有过期
    • 如果已过期,可以通过清除字段使其无效,并允许用户重新发送
  7. 如果令牌有效且可用,请将密码重置表单提供给用户
  8. 验证并更新密码并清除令牌和到期字段

  • 合理的建议; 但是这里可能值得注意的是,由于这些令牌是"密码等效的",因此不应将它们裸存储在数据库中:盐和散列它们就像用户密码一样. (2认同)

You*_*nse 9

我根本不会使用数据库.但是一种加密方式.
只需在邮件中提供的超链接中发送必要信息,由哈希签名.像这样的东西

$token = sha1($user_id.$time.$user_pass.$salt).dechex(time()).dechex($user_id);
$link = "http://".$domain."/restorepass/?token=$token";
Run Code Online (Sandbox Code Playgroud)

通过接收它只是拆分并解码它,然后检查哈希和超时.

  • 我认为这不可靠,因为攻击者可以使用新的dechex(time())修改旧令牌以重用它. (4认同)

fab*_*rik 3

您需要存储唯一的令牌和令牌到期时间戳。当用户访问唯一 URL 时,您必须验证令牌、用户名和令牌到期时间戳。如果一切正常,您可以发送新密码或显示用户可以设置新密码的表单。