MySQL 删除过期值

MySQL deleting expired values

我目前正在尝试制作一个忘记密码系统,它会向用户发送带有重置令牌的电子邮件。然后用户使用重置令牌来重置他们的密码。实际上,重置令牌将被设置为过期(在测试期间,我让它在发送电子邮件后 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 文件中,我有权让他们重置密码。它基本上清除了所有过期值,因此 table 不会有过期值:

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

我运行遇到的问题是,即使他输入的令牌已过期,用户仍然可以重设密码。我确保时间是正确的(为了确定,我什至等了 5 分钟)。不过令牌应该会在一分钟后过期。 谁能向我解释为什么会这样? 谢谢!

在您的第一个查询中,您使用的是列名称 "expire"。在您的第二个查询中,您使用的是列名 "expires".

我认为arcodesign已经给出了正确的答案,但我想知道你为什么要这样解决。对于我的项目,我总是使用 token-hashuser-id 和重置条目的 creation-date 创建一个单独的 table。

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

user-id: 使用单独的 table,如果重置过期,您可以随意删除该行,或者您可以保留它并告诉用户要求重新设置。

creation-date: 我会存储创建日期(只是 NOW())而不是到期日期,然后应用程序可以决定该日期是否已过期。您还可以在不迁移现有行的情况下更改重置 link 的有效期限。

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