Accanto al tuo resetkey
colonna inserire un DATETIME
colonna chiamata, forse, expires
.
Quindi, ogni volta che inserisci una nuova chiave di ripristino, inserisci anche un valore in scade:
INSERT INTO forgot (resetkey, expires) VALUES (whatever, NOW() + INTERVAL 48 HOUR)
Subito prima di leggere qualsiasi chiave di ripristino dalla tabella, eseguire le operazioni seguenti:
DELETE FROM forgot WHERE expires < NOW()
Quindi non vedrai mai una chiave scaduta; verranno sempre cancellati se sono scaduti.
Ora puoi scegliere di fare qualcosa cercando una chiave di ripristino fornita dall'utente. Se è scaduto, puoi annunciarlo all'utente:"La tua chiave di ripristino è scaduta". Ma questa è una cattiva idea ... per motivi di sicurezza non dovresti aiutare gli utenti a capire perché un token di sicurezza come una chiave di ripristino non è valido. Dovresti semplicemente dire "quel tasto di ripristino non è corretto".
Questo lascia aperta la possibilità che alcune righe contenenti token scaduti persistano nella tabella? Sì. Ma non sarà possibile per la tua app leggerli e utilizzarli effettivamente se segui la procedura per cancellare quelli scaduti prima di utilizzare qualsiasi token. Se avevi un motivo per evitare di mantenere i token scaduti nella tabella anche se sono inutili, potresti impostare un EVENT o un altro tipo di lavoro regolarmente pianificato per eseguire il DELETE
affermazione che ho menzionato.