Ved siden af din resetkey
kolonne placere en DATETIME
kolonne kaldet, måske, expires
.
Når du derefter indsætter en ny nulstillingsnøgle, skal du også indsætte en værdi i udløber:
INSERT INTO forgot (resetkey, expires) VALUES (whatever, NOW() + INTERVAL 48 HOUR)
Lige før du læser en nulstillingsnøgle fra tabellen, skal du gøre dette:
DELETE FROM forgot WHERE expires < NOW()
Så vil du aldrig se en udløbet nøgle; de vil altid blive udslettet, hvis de er udløbet.
Nu kan du vælge at gøre noget ved at slå en brugerleveret nulstillingsnøgle op. Hvis den er udløbet, kan du meddele det til brugeren:"Din nulstillingsnøgle er udløbet." Men det er en dårlig idé ... for sikkerhedens skyld bør du ikke hjælpe brugerne med at forstå, hvorfor et sikkerhedstoken som en nulstillingsnøgle er ugyldigt. Du skal bare sige "den nulstillingsnøgle er ikke korrekt."
Efterlader dette muligheden for, at nogle rækker, der indeholder udløbet token, vil forblive i tabellen? Ja. Men det vil ikke være muligt for din app faktisk at læse dem og bruge dem, hvis du følger proceduren med at slette de udløbne, før du bruger nogen tokens. Hvis du havde en grund til at undgå at beholde udløbne tokens i tabellen, selvom de er ubrugelige, kunne du konfigurere en BEGIVENHED eller en anden form for regelmæssigt planlagt job til at køre DELETE
udtalelse, jeg nævnte.