Obok Twojego resetkey
kolumna umieść DATETIME
kolumna o nazwie, być może, expires
.
Następnie, za każdym razem, gdy wstawiasz nowy klucz resetowania, wstawiaj również wartość do wygaśnięcia:
INSERT INTO forgot (resetkey, expires) VALUES (whatever, NOW() + INTERVAL 48 HOUR)
Tuż przed odczytaniem jakiegokolwiek klucza resetowania z tabeli, zrób tak:
DELETE FROM forgot WHERE expires < NOW()
Wtedy nigdy nie zobaczysz wygasłego klucza; zawsze zostaną wymazane, jeśli wygasną.
Teraz możesz zrobić coś, szukając klucza resetowania dostarczonego przez użytkownika. Jeśli wygasł, możesz poinformować użytkownika:„Twój klucz resetowania wygasł”. Ale to zły pomysł ... ze względów bezpieczeństwa nie powinieneś pomagać użytkownikom zrozumieć, dlaczego token bezpieczeństwa, taki jak klucz resetowania, jest nieprawidłowy. Po prostu powiedz „ten klawisz resetowania jest nieprawidłowy”.
Czy to otwiera możliwość, że niektóre wiersze zawierające wygasły token pozostaną w tabeli? Tak. Ale nie będzie możliwe, aby Twoja aplikacja faktycznie je odczytała i użyła, jeśli wykonasz procedurę usuwania wygasłych przed użyciem jakichkolwiek tokenów. Jeśli miałbyś powód, aby uniknąć trzymania w tabeli wygasłych tokenów, nawet jeśli są one bezużyteczne, możesz skonfigurować EVENT lub inny rodzaj regularnie zaplanowanego zadania, aby uruchomić DELETE
oświadczenie, o którym wspomniałem.