À côté de votre resetkey
la colonne place un DATETIME
colonne appelée, peut-être, expires
.
Ensuite, chaque fois que vous insérez une nouvelle clé de réinitialisation, insérez également une valeur dans expire :
INSERT INTO forgot (resetkey, expires) VALUES (whatever, NOW() + INTERVAL 48 HOUR)
Juste avant de lire une clé de réinitialisation du tableau, procédez comme suit :
DELETE FROM forgot WHERE expires < NOW()
Ensuite, vous ne verrez jamais une clé expirée ; ils seront toujours effacés s'ils ont expiré.
Maintenant, vous pouvez choisir de faire quelque chose en recherchant une clé de réinitialisation fournie par l'utilisateur. S'il a expiré, vous pouvez l'annoncer à l'utilisateur :"Votre clé de réinitialisation a expiré." Mais c'est une mauvaise idée ... pour des raisons de sécurité, vous ne devriez pas aider les utilisateurs à comprendre pourquoi un jeton de sécurité comme une clé de réinitialisation n'est pas valide. Vous devriez juste dire "cette clé de réinitialisation n'est pas correcte."
Cela laisse-t-il la possibilité que certaines lignes contenant un jeton expiré persistent dans la table ? Oui. Mais il ne sera pas possible pour votre application de les lire et de les utiliser si vous suivez la procédure d'effacement des jetons expirés avant d'utiliser des jetons. Si vous aviez une raison d'éviter de conserver les jetons expirés dans la table même s'ils sont inutiles, vous pouvez configurer un EVENT ou un autre type de travail planifié régulièrement pour exécuter le DELETE
déclaration que j'ai mentionnée.