Mittwoch, 23. Februar 2011

PHP Registrierungen

Wie erstellt man eigentlich eine vernünftige Registrierung in PHP?

(Date/Datum: 080706-23:11, Hits: 4621) Ziel soll es für dieses Posting sein, ein vorhandenes Registrierformular so zu verändern, dass eine Überprüfung der Mailadresse durchgeführt werden kann. Aus der Sicht des Benutzers läuft es dabei üblicher Weise folgendermaßen ab:

1. Der Benutzer registriert sich und gibt dabei seine Mailadresse an.
2. Der Benutzer erhält eine Mail mit einem Bestätigungslink zum anklicken.
3. Der Benutzer klickt den Link an und dadurch wird sein Account aktiviert.
4. Die Mailadresse ist damit automatisch verifiziert und der Benutzer darf sich einloggen.

Hier also eine Kochanleitung:

Gegeben seine Datenbank im Hintergrund. Dann gibt es sicherlich eine Tabelle mit Benutzern. Dieser Tabelle fügt man zunächst ein Flag reg_sf (das steht für registration_successful) hinzu. Nachdem ein Benutzer sich registriert, wird in diesem Flag zunächst eine '0' oder ein 'n' eingetragen, was bedeutet, dass der Account noch nicht aktiviert wurde.

Zeitgleich wird in einer neuen Tabelle, ich nenne sie authkeys, ein Aktivierungscode für den Benutzer hinterlegt. In der Tabelle muss eigentlich nur die User-ID und der Authentifizerungs-Key (den der Benutzer per Mail bekommt) eingetragen werden.

Den Authentifizerungskey muss man zunächst erzeugen, dann in die Datenbank eintragen und anschließend dem Benutzer (in Linkform) per Mail schicken. Erzeugen lässt sich ein solcher Key etwa mit einer Hashfunktion (160 Bit oder mehr sollten es mindestens sein!). Dazu kann man nun verschiedene Attribute des Users (die dann aber einzigartig sein müssen!), die Zeit, Zufallszeichen etc. in einem String kombinieren. Einfach angewandt würde dies etwa so aussehen:

Erzeugung des Hashwertes:

$sha1key = sha1($username."ewfwoengerugberig43t34wg".
$password.$vorname.'abcd43ghe3gh349gherughergerg'.time());

Eintragen des Keys in die Datenbank:

/* Hier sollte man noch sicherheitshalber einige Sonderzeichen rausfiltern,
* aber das gilt ja für praktisch alle Inputs, die man in PHP bekommt.
* Dazu werde ich vielleicht in einem Posting etwas schreiben, aber google
* weiß auch Rat!
*/
$sqlcmd = "INSERT INTO authkeys (uid,authkey) values ";
$sqlcmd .= "(".mysql_real_escape_string($uid).", ".$sha1key.");";
if (!($res = mysql_query($sqlcmd))) {
die('Invalid MySQL query');
}

Nachdem der Key mit einem INSERT in die Datenbank übertragen wurde, wird der User nun noch (am besten via HTML-Mail zum "draufklicken") informiert. Wie das geht, erfährt man hier. Der Link hat dann die Form eines typischen PHP-Links, etwa http://meineseite.xyz/?sub=aktivierung&user=maxmuster&authkey=94jg34ng3904ugn34gn34g.

Jetzt fehlt noch die Aktivierungsseite (also die Seite, auf die der Benutzer in seiner Mail klickt). Diese Seite prüft, ob der Aktivierungsschlüssel für den Benutzer existiert. Ist dem so, dann werden noch folgende Schritte durchgeführt:

1. Das reg_sf-Flag für den Benutzer wird auf 'y' bzw. '1' gesetzt.
2. Das Tupel (User-ID, Authentifizerungs-Key) wird aus der authkeys-Tabelle gelöscht.

Account aktivieren und Benutzer löschen:

UPDATE `users` SET `reg_sf`='y' WHERE `uid`='...' AND ...;
DELETE FROM `authkeys` WHERE `uid`='...' AND `authkey`='...';

Nun ist man fast fertig. Aber eine Sache fehlt noch: Der Code hinter einem Login-Formular muss dahingehend modifiziert werden, dass er beim Login von nun an das Flag reg_sf überprüft.

Modifizierung des Login-SQL-Befehls:

SELECT COUNT(*) FROM `users` WHERE `username`='...' AND `password`='...' and `reg_sf`='y'

Man sollte an dieser Stelle aber bei einer Produktivseite auf GAR KEINEN Fall vergessen, dass alle bisherigen Benutzer keine aktivierten Accounts haben. In diesem Fall ist es sinnvoll, das reg_sf-Flag für alle alten Benutzer auf 'y' zu setzen. (Das ist dann die Bestrafung dafür, dass man nicht gleich eine entsprechende Funktion implementiert hat ;-))

Feedback und Fragen sind von mir wie immer ausdrücklich erwünscht!

Keine Kommentare:

Kommentar veröffentlichen