Best Practices für E-Mail-Bestätigungscodes

Ich erstelle eine PHP-Website, auf der sich Benutzer anmelden, und frage mich, welche Best Practices für "E-Mail-Bestätigungscodes" gelten.

Neue Benutzer müssen ihre E-Mail-Adressen bestätigen. Dazu erstelle ich einen Code und sende ihn dem Benutzer in einer E-Mail, mit der er dann sein Konto aktivieren kann. Anstatt diesen Schlüssel in einer Datenbank zu speichern, verwende ich eine praktische kleine Problemumgehung: Der Code ist das Ergebnis von:

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

Wobei sich $ timestamp auf die Benutzererstellungszeit bezieht. Im Großen und Ganzen war ich damit sehr zufrieden, aber dann musste ich mir überlegen, ob das sicher genug ist. Und was ist mit der Möglichkeit von Kollisionen? Außerdem muss ich Codes zum Zurücksetzen des Passworts usw. generieren. Wenn ich eine ähnliche Methode verwende, kann eine Kollision dazu führen, dass ein Benutzer versehentlich das Passwort eines anderen Benutzers zurücksetzt. Und das ist nicht gut.

Wie machst du diese Dinge? Meine Gedanken waren eine Tabelle des folgenden Formats:

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

Wobei "Typ" 1, 2 oder 3 ist, was "Aktivierung", "E-Mail-Änderung" oder "Zurücksetzen des Passworts" bedeutet. Ist das ein guter Weg, es zu tun? Hast du einen besseren Weg?

Kann ich mit einer ähnlichen Methode automatisch etwas löschen, das älter als zwei Tage ist, ohne Cron-Jobs zu verwenden? Mein Host (fast freespeech.net) unterstützt sie nicht. Wenn möglich, möchte ich vermeiden, einen Cron-Job auf einem externen Host zu haben, der ein Skript enthält, das Dinge löscht, da dies nur chaotisch ist = P.

Vielen Dank!
Mala

Aktualisieren:
Zur Verdeutlichung: Ich habe festgestellt, dass die einzige Möglichkeit zur sicheren Ausführung dieser Aufgabe die Verwendung einer Datenbank ist, was mit der ursprünglichen Funktion vermieden werden sollte. Meine Frage ist, wie der Tisch (oder die Tische?) Aufgebaut sein soll. Jemand schlug vor, ich solle CodePK beseitigen und den Code einfach zu einer PK machen. Kurz gesagt, meine Frage lautet: Ist es das, was Sie tun?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage