MySQL删除过期的值

时间:2015-03-27 20:02:23

标签: php mysql email passwords

我目前正在尝试建立一个忘记密码系统,它会向用户和电子邮件发送重置令牌。然后,用户使用重置令牌重置其密码。实际上,重置令牌将设置为过期(在测试过程中,我会在发送电子邮件后的1分钟内过期)。

在我忘记密码的php文件中,我在发送电子邮件之前就已经这么做了(注意$ token是发出的令牌):

$query2 = $con->prepare("UPDATE UserName SET resetkey = '$token', expire = NOW() + INTERVAL 1 MINUTE WHERE userName = :user");
$query2->bindParam(':user',$username);
$query2->execute();

然后在我的密码重置php文件中我有这个权利他们重置他们的密码。它基本上清除了所有过期的值,因此表格不会有过期值:

$purge = $con->prepare("UPDATE UserName SET resetkey = NULL WHERE expires < NOW()");
$purge->execute();

我遇到的问题是,即使用户输入的令牌已过期,用户仍可以重置密码。我确定时机是正确的(我甚至等了5分钟才确定)。令牌应该在一分钟后到期。 任何人都可以向我解释为什么会发生这种情况吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

我认为arcodesign已经给出了正确答案,但我想知道你为什么这样解决它。对于我的项目,我总是创建一个单独的表格,其中包含重置条目的token-hashuser-idcreation-date

token-hash:在那里存储令牌的哈希值,而不是令牌本身。否则,对数据库具有读访问权限的攻击者(SQL注入)可能要求为他喜欢的任何电子邮件地址重置密码,并且因为他可以看到新令牌,他可以使用它来设置自己的密码。

user-id:使用单独的表,如果重置已过期,您可以自由删除该行,或者您可以将其保留并告诉用户要求重置。

创建日期:我会存储创建日期(仅NOW())而不是到期日期,然后应用程序可以决定此日期是否已过期。您还可以更改重置链接有效的时间段,而无需迁移现有行。

也许您想查看我的password-reset课程,这有助于构建此类令牌。

答案 1 :(得分:0)

在您的第一个查询中,您使用的是列名称&#34; expire&#34;。在第二个查询中,您使用的是列名称&#34; expires&#34;。