Sitzungen
Beim Schreiben einer Webanwendung stellt sich oft die Frage, wie man einen einzelnen User auf der Seite
identifizieren kann. Der Grund für das Dilemma liegt darin, daß das HTTP-Protokoll (die
«Sprache», in der sich Webserver und Browser verständigen)
zustandslos ist. Das bedeutet, daß der Webserver keine Verbindung zwischen den einzelnen
Anfragen der Browser herstellen kann. Warum das ein Problem ist, könnt Ihr an folgendem Beispiel
sehen: Im Administrationsbereich eines Webforums muß man sich natürlich mit Username und
Passwort ausweisen, bevor man beispielsweise einen User sperren darf. Aber woher soll der Webserver
wissen, ob sich hinter der Anfrage "Sperre User XY" der Admin verbirgt, der sich ein Dutzend Anfragen
vorher im Adminbereich eingeloggt hat? Die Anfragen sind ja unabhängig voneinander ...
Dieses Problem ist in PHP recht elegant mit sogenannten Sessions
gelöst. Innerhalb einer solchen Session bekommt der User (bzw. sein Browser) eine
SessionID zugewiesen, durch die Ihr ihn in Eurem Skript identifizieren
könnt. Praktischerweise müßt Ihr Euch um diese Identifizierung noch nicht einmal
selbst kümmern. PHP legt auf Wunsch Variablen sozusagen mehrfach an, für jede SessionID
einmal, mit unabhängigen Werten. Das bedeutet, für alle Anfragen mit der UserID 1 kann die
Variable $eingeloggt true sein und für alle Anfragen mit der UserID 2 false.
Auch an dieser Stelle (wie schon bei der Wertübergabe) hat es beim Schritt zur Version 4.2 eine
Veränderung gegeben. Seither befinden sich alle Variablen, die für verschiedene SessionIDs
verschiedene Werte haben sollen, im superglobalen Array $_SESSION. Die
oben erwähnte Variable $eingeloggt müßte also eigentlich $_SESSION['eingeloggt']
heißen. Mit $_SESSION könnt Ihr ganz normal arbeiten (Werte eintragen und wieder auslesen),
die Werte sind nur für jede SessionID unabhängig
echo "Hallo, " . $_SESSION['username'] . "<br>";
echo "du hast folgende Rechte:<br>";
if ($_SESSION['schliessen'] != 0)
echo "Themen schließen<br>";
if ($_SESSION['loeschen'] != 0)
echo "Beiträge löschen<br>";
if ($_SESSION['sperren'] != 0)
echo "Benutzer sperren<br>";
Eine solche Session eröffnen könnt Ihr mit der Funktion
session_start(). Wenn der anfragende Browser bereits eine SessionID hat,
nimmt session_start() diese bestehende Session wieder auf. Daher solltet Ihr die Funktion am Anfang jedes
Skripts aufrufen, in dem Ihr $_SESSION verwendet. Damit ist nämlich sichergestellt, daß der
Browser eine SessionID hat, auch wenn er das jeweilige Skript direkt aufruft (und nicht beispielsweise
über die Login-Seite kommt).
Wichtig ist hier am Anfang, weil die
SessionID mit den sogenannten HTTP-Headern verschickt wird. Diese
werden an den Browser geschickt, sobald die erste HTML-Ausgabe ausgewertet wurde. Und wenn die
Header erst mal verschickt sind, könnt Ihr sie logischerweise nicht mehr ergänzen. Folgendes
Beispiel führt also zu einer Fehlermeldung
...
<h1>Herzlich Willkommen auf meiner Seite</h1>
<h3>Bitte loggen Sie sich ein</h3>
<?php
session_start(); // Session starten
?>
...
Ein anderer Stolperstein ist ein bestimmter Eintrag in der php.ini. Die verschiedenen Werte in $_SESSION
für die verschiedenen SessionIDs müssen natürlich auch irgendwo gespeichert werden.
Dazu benutzt PHP ein Verzeichnis auf dem Server, das in der php.ini angegeben ist. Da PHP auf und
für Linux entwickelt wird, ist der Standard für dieses Verzeichnis /tmp. Das wird PHP aber auf
Windows-Rechnern vergeblich suchen und entsprechend mit einer Fehlermeldung reagieren. Die
könnt Ihr damit beheben, daß Ihr in der php.ini einfach ein existierendes Verzeichnis eintragt,
in dem PHP seine Daten speichern kann. Die php.ini ist (wie gewohnt) eine normale Textdatei, die Ihr mit
dem Texteditor Eurer Wahl bearbeiten könnt.
Beendet wird eine Session entweder automatisch, wenn der User alle Browserfenster (nicht nur das mit
Eurer Seite!) schließt oder Ihr die Session explizit selbst beendet. Für letzteres gibt es
die Funktion session_destroy. Gespeichert wird die SessionID auf dem
Client-Rechner in Form eines Cookies. Das bedeutet, Eure User müssen Cookies akzeptieren, um
auf Eurer Seite surfen zu können, wenn Ihr Sessions verwendet.
Der Vollständigkeit halber noch kurz die Beschreibung der «alten» Methode vor
PHP 4.2. Damals mußtet Ihr Eure Variablen bei der Session registrieren,
und zwar mit der Funktion session_register(). Dann konntet Ihr die Variablen
ganz normal verwenden, ähnlich wie Ihr es bei der Werteübergabe vor PHP 4.2 gesehen habt.
Allerdings hatte dieses Verfahren auch die gleichen Sicherheitslücken wie die alte Version der
Wertübergabe, daher wurde $_SESSION eingeführt.
|