Geschrieben von tct am 05.09.2004, 13:06

Jeder, der selber ein kleines Loginscript mit Username und Passwort hat, kennt das Problem sicherlich. Man muss sich ständig neu einloggen, wenn man mal was überprüfen, verändern usw will.
Abhilfe können da Cookies schaffen, allerdings kann in einem Cookie immer nur eine Variable gespeichert werden. Somit hat man nun die Qual der Wahl: Zwei Cookies senden, damit Name und Passwort gespeichert werden oder irgendwie versuchen den Login nur über eine Variable zu regeln. Nun beides ist nicht sonderlich toll, deshalb gibt es in PHP doch eine (recht sichere) Möglichkeit, mehrere Variablen in einem Cookie zu speichern, die Funktion serialize(). Genau das möchte ich euch hier näher bringen, da ich das selber benötigt habe. Im Internet findet man darüber nicht wirklich viel, weshalb ich es hier nochmal verständlich erklären will.

Zuerst braucht man einen ganz normalen Login, mit Username und Passwortabfrage, wie das geht setze ich mal vorraus. Zusätzlich sollte man nun noch eine Checkbox hinbauen, mit "Autologin" oder der gleichen.
Wird nun auf Absenden gedrückt, muss zuerst der Login mit der Datenbank verglichen werden, wenn alles stimmt, kann man schonmal die Session registrieren. Soweit ist ja alles schon bekannt. Doch nun muss man noch überprüfen ob die Checkbox angewählt ist, also ob der User beim nächsten Login einen Cookie benutzen möchte. Ist das der Fall, wird der Cookie gesetzt, allerdings wollen wir ja beide Varialben, also Username und Passwort speichern. Hier kommt nun die Funktion serialize() zum Einsatz.
Im Code sieht das folgendermaßen aus:

if(isset($_POST['autologin'])) //die Überprüfung der Checkbox mit dem Namen "autologin"
{
$daten=array($user_name, $user_pass); // die Daten Username und Passwort werden in ein Array gepackt
$daten=serialize($daten); // nun kommt die Funktion serialize zum Einsatz
setcookie("Cookiename", $daten, time()+2592000); // der Cookie wird gestzt mit Gültigkeit für einen Monat
}

Soweit so gut. Aber was macht serialize() nun eigentlich? Um das ein bisschen besser zu verstehen, betrachen wir mal was nun eigentlich in $daten drinne steht:

echo "$daten"; // ergibt folgendes: a:2:{i:0;s:8:"Username";i:1;s:8:"Passwort";}
// a:2 ist die Anzahl der Elemente
// i:0 ist das erste Element, die Zählung beginnt bei Null
// s:8 ist die Länge des Elements, hier acht
// "Username" ist dann der eigentliche String

Serialize schreibt also alle Elemente des Arrays $daten hintereinander, nummeriert sie, stellt die Länge fest und die gesamte Anzahl der Elemente. Naturlich könnte man das auch alles selber machen, aber warum, wenn es dazu eine Funktion gibt. Im Cookie hat das nun den Vorteil, das man das sehr einfach wieder auswerten kann, und da das im Cookie natürlich nicht so übersichtlich gespeichert wird, ist es auch recht sicher. Wenn man das ganze vorher noch mit einer md5-Verschlüsselung kombiniert, kann man also die Daten nicht mehr einsehen, selbst wenn man den Cookie im Windows öffnen würde.
Nun gut, haben wir das also alles soweit im Cookie gespeichert. Nun kommt der User wieder und will sich natürlich nicht nochmal einloggen, da er ja eigentlich zugestimmt hat einen Cookie zu senden. Müssen wir uns nun also noch daran machen das ganze wieder "verständlich" zu übersetzen. Dazu gibt es natürlich auch wieder eine Funktion: unserialize().
Der Code dazu sähe also wie folgt aus:

if(isset($_COOKIE['Cookiename'])) // überprüft, ob es einen Cookie gibt
{
$cookie_array=stripslashes($_COOKIE['Cookiename']); // das stipslashes muss vor die Funktion unserialize, da sonst die Fehlermeldung Notice: unserialize(): Argument is not an string in PFAD ZUM SCRIPT on line XX erscheint. Das liegt daran, weil die Daten im Cookie in Anführungsstrichen gespeichert werden und damit kann unserialize nichts anfangen
$cookie_array=unserialize($cookie_array); // unserialize wird angewendet
$user_name=$cookie_array[0]; // so greift man auf das erste Element zu
$user_pass=$cookie_array[1]; // so auf das zweite usw...
}

Nachdem man den Cookie nun wieder zerlegt hat, muss man diese Daten natürlich noch überprüfen (z.b. mit den Daten in einer Datenbank), denn es könnte ja trotzdem jemand versuchen sich unerlaubt Zugriff zu verschaffen. Aber wie schon erwähnt, wenn man statt den "Rohdaten", md5-Hashs nimmt, ist das eigentlich nicht mehr möglich. Wie die Überprüfung auszusehen hat, überlasse ich wieder euch, weil dazu gibt es ja genung Tuts. Auch die ausgelesenen Daten dann in einer Session zu registrieren ist natürlich möglich.

Ich hoffe ihr findet irgendwann mal eine Verwendung bei euch dafür. Ich finde diese Möglichkeit sehr einfach und sicher ist sie im Prinzip auch. Sicherlich gibt es nicht, was man nicht knacken kann, aber so wird es einem "Bösewicht" schon ein wenig schwerer gemacht.

mfg tct

Kleines Nachwort: Ich bin mir bewusst, dass es noch weitere Möglichkeiten gibt, mehrere Variablen in einem Cookie zu speichern (siehe z.B. hier http://www.tutorials.de/tutorials10088.html), allerdings ist das alles längst nicht so sicher und auch einfach, wie die hier beschriebene Methode. Und, dass es wirklich was taugt was ich hier beschrieben habe, sieht man schon daran, dass die meisten großen Forensysteme wie phpBB und WBB genau diese Methode benutzen.

Bewertung Anzahl
6
75,0 %
3 Bewertungen
5
25,0 %
1 Bewertungen