MySQL如何使值过期?

时间:2015-03-23 21:02:32

标签: php mysql email

所以我目前正在为网站设计一个忘记密码功能。基本上,当用户点击忘记密码时,它会向他们发送一封带有重置令牌的电子邮件。我希望重置令牌在48小时后到期(出于安全原因)。我将如何在MySQL和PHP中执行此操作。我的表中有一个名为resetkey的列,当48小时结束时,我希望系统清除与用户用户名关联的resetkey / token。

谢谢!

3 个答案:

答案 0 :(得分:4)

在您的resetkey列旁边放置DATETIME列,可能是expires

然后,无论何时插入新的重置键,还要将值插入到期:

INSERT INTO forgot (resetkey, expires) VALUES (whatever, NOW() + INTERVAL 48 HOUR)

在您从表中读取任何重置键之前,请执行以下操作:

DELETE FROM forgot WHERE expires < NOW()

然后你永远不会看到过期的密钥;如果他们已经过期,他们总会被彻底消灭。

现在,您可以选择查找用户提供的重置键。如果它已过期,您可以向用户宣布:&#34;您的重置密钥已过期。&#34;但这是一个坏主意 ...出于安全考虑,您不应该帮助用户理解为什么像重置密钥这样的安全令牌无效。你应该说&#34;重置键不正确。&#34;

答案 1 :(得分:0)

除了专栏resetkey之外,您还会有一列resetDeadline。当他们获得重置令牌时,您将设置将来某个日期时间的截止日期。当他们尝试使用resetkey登录时,请始终检查NOW() < resetDeadline。如果是,则检查重置键并允许重置。如果不是,那么不要费心检查重置键 - 只是不要允许它。

答案 2 :(得分:0)

我将为此使用MySQL事件:

CREATE EVENT IF NOT EXISTS `dbName`.`eventName`
ON SCHEDULE
EVERY 1 DAY // or 1 HOUR
COMMENT 'Description'
DO
BEGIN

DELETE FROM `dbName`.`TableName` WHERE `expireDateCol` < NOW();

END

并启用MySQL Event Scheduler,请参见原始源代码。

来源:https://stackoverflow.com/a/24568566/2069181