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

时间:2010-07-02 10:40:35

标签: php

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

4 个答案:

答案 0 :(得分:35)

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

答案 1 :(得分:9)

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

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

通过接收它只需拆分并解码,然后检查散列和超时。

答案 2 :(得分:3)

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

答案 3 :(得分:0)

我会通过设置另一个名为pessword_reset_sessions的数据库来解决这个问题。

这样您就可以存储以下内容:

用户标识 generalhash userhash timeinititated 尝试

然后使用用户ID,您将获得用户ID obv,一般哈希是一个未向用户显示但用于创建用户哈希的哈希。

timeinitiated应该是他第一次请求新密码时的UNIX时间戳。

一旦您确认请求密码的用户已输入验证信息,如电子邮件,姓名,密码问题。在密码重置表中创建一行。

并发出包含userhash的电子邮件。

当散列通过$_GET['hash']返回时,您从generalhash创建另一个散列,以与通过$ _GET []传递的散列进行比较,如果散列不匹配,则增量attempts

你也可以先检查一下,确保他没有多次尝试安全性。