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