Naast je resetkey
kolom plaats een DATETIME
kolom genaamd, misschien, expires
.
Telkens wanneer u een nieuwe reset-sleutel invoert, moet u ook een waarde invoegen in expires:
INSERT INTO forgot (resetkey, expires) VALUES (whatever, NOW() + INTERVAL 48 HOUR)
Doe dit vlak voordat u een reset-toets uit de tabel leest:
DELETE FROM forgot WHERE expires < NOW()
Dan zie je nooit een verlopen sleutel; ze worden altijd gewist als ze zijn verlopen.
Nu zou je ervoor kunnen kiezen om iets te doen met het opzoeken van een door de gebruiker verstrekte reset-sleutel. Als deze is verlopen, kunt u dat aan de gebruiker melden:"Uw reset-sleutel is verlopen." Maar dat is een slecht idee ... om veiligheidsredenen moet u gebruikers niet helpen begrijpen waarom een beveiligingstoken zoals een resetsleutel ongeldig is. Je moet gewoon zeggen "die reset-sleutel is niet correct."
Laat dit de mogelijkheid open dat sommige rijen met een verlopen token in de tabel blijven staan? Ja. Maar het is niet mogelijk voor uw app om ze daadwerkelijk te lezen en te gebruiken als u de procedure volgt om de verlopen te wissen voordat u tokens gebruikt. Als je een reden had om verlopen tokens niet in de tabel te bewaren, ook al zijn ze nutteloos, dan zou je een EVENT of een ander soort regelmatig geplande taak kunnen opzetten om de DELETE
uit te voeren. verklaring die ik noemde.