Najlepsze praktyki dotyczące kodów potwierdzających e-mail

Tworzę stronę PHP, która wymaga rejestracji użytkowników, i zastanawiam się nad najlepszymi praktykami dotyczącymi kodów „e-mail potwierdzających”.

Nowi użytkownicy muszą potwierdzić swoje adresy e-mail - robię to, generując kod i wysyłając go do użytkownika w e-mailu, który może następnie wykorzystać do aktywacji swojego konta. Zamiast przechowywać ten klucz w bazie danych, używam poręcznego małego obejścia: kod jest wynikiem:

md5("xxxxxxxxx".$username."xxxxxxxxxxx".$timestamp."xxxxxxxxx");

Gdzie $ timestamp odnosi się do czasu utworzenia użytkownika. Ogólnie byłem z tego bardzo zadowolony, ale potem zacząłem myśleć, czy to jest wystarczająco bezpieczne? A co z możliwością kolizji? Muszę też wygenerować kody do resetowania hasła itp. Jeśli użyłem podobnej metodologii, kolizja może spowodować, że jeden użytkownik przypadkowo zresetuje hasło innego użytkownika. I to nie jest dobre.

Jak więc robisz te rzeczy? Moje myśli były tabelą w następującym formacie:

codePK (int, a-I), userID (int), type (int), code (varchar 32), date (timestamp)

Gdzie „typ” to 1, 2 lub 3, co oznacza „aktywacja”, „zmiana adresu e-mail” lub „resetowanie hasła”. Czy to dobry sposób na zrobienie tego? Czy masz lepszy sposób?

Czy za pomocą metody podobnej do powyższej mogę automatycznie usunąć cokolwiek ponad dwa dni bez korzystania z zadań cron? Mój host (prawiefreespeech.net) ich nie obsługuje. Jeśli to możliwe, chciałbym uniknąć zadania cron na zewnętrznym hoście, który jest skryptem wget, który usuwa rzeczy, bo to tylko bałagan = P.

Dzięki!
Mała

Aktualizacja:
Aby wyjaśnić: zdałem sobie sprawę, że jedynym sposobem na bezpieczne i bezpieczne wykonanie tego zadania jest użycie bazy danych, której starała się uniknąć oryginalna funkcja. Moje pytanie dotyczy tego, jak powinna wyglądać tabela (lub tabele?). Ktoś zasugerował, abym pozbył się codePK i po prostu zrobił kod PK. Krótko mówiąc, moje pytanie brzmi: czy to jest to, co robisz?

questionAnswers(5)

yourAnswerToTheQuestion