Sessions Teil 3 - Praxis

  • Nach der langen Einführung und dem ersten PHP-Code gibt's in diesem Teil endlich wieder ein paar brauchbare Codeschnipsel für den eigenen Gebrauch. Als praxisnahes Beispiel bauen wir in diesem Teil mit vorhandenen und neuen Codeschnipseln einen kleinen geschützten Login-Bereich. Für einen Login-Bereich brauchen wir zunächst eine Seite, die das Anmelden für diesen Bereich überhaupt erst einmal ermöglicht. Hier ist es das Skript login.php. Der geschützte Bereich beschränkt sich auf die Seite logged.php und zum Abmelden gibt es dann noch logout.php. Alle Beispiel-Skripe sind auf das Wesentliche gekürzt, zum Ende gibt's Vorschläge zur Verbesserung bzw. Erweiterung. Die Anmelde-Maske beispielsweise können Sie außerdem auch ganz alleine frei gestalten. (login.php)<?php if(<#$>_POST['submit'] && <#$>_POST['user'] == 'test' && <#$>_POST['password'] == 'test') { ini_set('session.use_cookies', '0'); session_name('id'); session_start(); <#$>user = 'Gerd'; <#$>ip = <#$>_SERVER['REMOTE_ADDR']; session_register('user'); session_register('ip'); header('Location: logged.php?id=' . session_id()); exit;}?>Benutzer: <input type="text" name="user" size="25" />Passwort: <input type="password" name="password" size="25" /><input type="submit" name="submit" value="Anmelden" />(logged.php)<?php function check_session() { ini_set('session.use_cookies', '0'); session_name('id'); session_start();if(!isset(<#$>_SESSION['user']) || <#$>_SESSION['ip'] != <#$>_SERVER['REMOTE_ADDR']) { session_destroy(); header('Location: login.php'); exit; }}check_session();echo('Willkommen im geschützten Bereich, ' . <#$>_SESSION['user'] . '!');echo('<a href="logout.php">Abmelden</a>');?>(logout.php)<?php ini_set('session.use_cookies', '0');session_name('id');session_start();session_destroy();header('Location: login.php');?> Kurz und knapp: Was passiert? Der Benutzer meldet sich über die login.php an. Die Zugangsdaten sind zur Zeit Benutzer: test und Passwort: test. Sollten die eingegebenen Daten stimmen, wird eine Session gestartet und zum geschützten Bereich per header() weitergeleitet. Hier greift dann die Funktion check_session() und überprüft die Gültigkeit der Session-Daten. Wenn etwas mit den Session-Daten faul ist, wird auf die login.php umgeleitet. Ansonsten erscheint ein Text mit einem Link zum Abmelden. logout.php löscht schließlich die Session und leitet zur login.php zurück. Was es mit ini_set() und der Überprüfung der Session-Daten auf sich hat, gibt's im nächsten Teil. Versuchen können Sie jedoch schon einmal folgendes: Rufen Sie einfach einmal die logged.php direkt auf. Sie werden (weil Sie nicht angemeldet sind) zur login.php zurückgeworfen. Mehr möchte ich aber noch nicht vorwegnehmen. Kommen wir zu den Verbesserungs- und Erweiterungsvorschlägen. Der Nachteil des Skripts ist, dass es nur einen möglichen Benutzer gibt und dass das Passwort offen leserlich ist. Die "Premium"-Lösung liegt aber auf der Hand. Es gibt bereits Codeschnipsel zum problemlosen Speichern und Auslesen von beliebigen Daten in Dateien. Sie können nun also ein mehrdimensionales Array entwerfen, welches Benutzername, Passwort und E-Mail-Adresse etc. aufnimmt und dieses in einer Benutzerdatei abspeichern. Das verschlüsselte Sichern von Passwörtern habe ich ebenfalls schon in einem Codeschnipsel behandelt. Die login.php muss diese Benutzer-Daten dann zur Überprüfung der Anmeldung laden und in einer Schleife nach dem Benutzer suchen. Wird der Benutzer gefunden, muss das übergebene Passwort noch mit dem gespeichertem Passwort übereinstimmen, dann kann endlich zum geschützten Bereich geleitet werden. Was gibt es noch zu bemängeln? Der geschützte Bereich ist hier auf eine Seite beschränkt. Tatsächlich muss aber nur eins gemacht werden: Die Funktion check_session() auslagern und jeweils mit include() bei den gewünschten Seiten, die einen Schutz erhalten sollen, einbinden und die Funktion check_session() aufrufen, danach kann der Ausgabe der jeweiligen Seite erfolgen. Schließlich ist die Anmeldung selbst noch etwas umständlich. Während das Achten auf Groß- und Kleinschreibung beim Passwort eigentlich normal ist, wird bei der Eingabe des Benutzers darauf nur selten Wert gelegt. Die login.php muss dazu am besten den übergebenen und gespeicherten Benutzernamen komplett in Großbuchstaben umwandeln. Anschließend kann per if-Verzweigung verglichen werden.