previous up contents next

Sessionmanagement mit PHP4

Sessionmanagement mit PHP ist sehr komfortabel. Es basiert auf der Vergabe einer eindeutigen Session-ID und stützt sich zunächst auf Cookies. Dies sind Informationen, die der Server auf dem Client speichern kann und die auf der Client-Seite verwaltet werden (siehe Vortrag von Dorothea Fischer und Felix Binroth). Cookies sind jedoch nicht unbedingt auf allen Browsern implementiert, oder sie sind aufgrund ihres schlechten Rufes (Sicherheitsproblematiken und ausspionieren des Benutzers) in vielen Browsern deaktiviert. Somit wäre es nicht sinnvoll, ein Sessionmanagement nur auf Cookie-Ebene aufzubauen, da dadurch viele Benutzer ausgeschlossen wären. Durch Einsatz des Sessionmanagements von PHP4 kann jedoch auch diese Problematik umgangen werden. Besucht ein Benutzer erstmals eine Seite (oder loggt er sich ein), so kann im Skript eine neue Session angelegt werden. PHP erzeugt für jede neue Session, die von einem Client angefordert wird, eine Session-ID und eine Datei: /tmp/sess_IchBinEineSessionID. Möchte der Programmierer nun eine Variable bis zum nächsten Seitenabruf eines Benutzers verfügbar halten (eine sogenannte Sessionvariable), so kann er diese Variable mittels der Funktion: session_register(Variablenname) markieren. Der Wert dieser Variablen wird dann von PHP in der o.g. Datei zwischengespeichert. Die einzige Information, die nach außen gegeben wird, und die der Benutzer in seinem Browser sehen kann, ist die Session-ID (s.o.). So werden auch Manipulationsmöglichkeiten durch den Benutzer minimiert, die bei anderen Lösungsansätzen (reine Hidden-Field Lösung)3 gegeben sind. Der Programmierer kann jedoch auch selbst die Verwaltung dieser Session-Daten übernehmen, beispielsweise um diese in einer Datenbank zu speichern, was bei einer großen Serverlast wohl der Version mit den Dateien im Hinblick auf Sicherheit und Geschwindigkeit überlegen sein dürfte. Aber auch bei diesem Ansatz wird der Programmierer von PHP unterstützt. Er muß nur einige Funktionen schreiben (sog. Handler), die dann von den PHP Standard-Funktionen zur Speicherung der Daten verwendet werden, und kann dann im folgenden mit den Standardfunktionen arbeiten. Durch diesen Ansatz ist es auch einfach, eine neue Art der Speicherung von Session-Daten einzuführen, ohne den kompletten Quellcode umzuschreiben.
Was leistet PHP, um die Verwaltung der Sessions so einfach wie möglich zu halten?
In einem PHP-Skript kann die Funktion session_start() aufgerufen werden. Diese Funktion sorgt dafür, daß bei der Ausgabe von HTML eine Überarbeitung des Quelltextes stattfindet. Dabei wird beispielsweise allen lokalen Links ein Query-String4angehängt (URL-Rewriting). Allen im HTML-Dokument definierten Formularen wird ein Hidden-Field mit der Session-ID hinzugefügt. Somit muß der Programmierer diese fehlerträchtige Aufgabe nicht mehr selbst erledigen. Wird das Programm nun im folgenden von einem Benutzer aufgerufen, dem bereits eine Session-ID zugewiesen wurde, werden mittels session_start() die Sessionvariablen wiederhergestellt. Die Variablen werden von ihrem Speicherort gelesen und mit den gespeicherten Werten initialisiert. Das Programm befindet sich wieder im gleichen Zustand, in dem es beim letzten Aufruf beendet wurde und kann nun die vom Benutzer geforderte Aktion ausführen. Durch diese Mechanismen wird es dem Programmierer ermöglicht auf ``persistente Daten'' zuzugreifen. Soll eine Session zerstört werden, so kann dies mit Hilfe der Funktion session_destroy() geschehen. Dabei wird die Datei gelöscht, welche die Sessiondaten enthält. Zudem werden mit Hilfe der automatischen Garbage Collection abgelaufene Sessions (session_timeout) automatisch gelöscht. Man muß jedoch beachten, daß sich Objekte in PHP4 nicht in Sessions speichern lassen. Dies könnte einer der Verbesserungspunkte der nächsten PHP-Versionen sein. Die Session-ID steht im Programm ständig unter der Variablen: $PHPSESSID zur Verfügung.

Schaut man sich den Quelltext (siehe Listing [*]) des Skriptes und den Quelltext der beim Browser ankommt an (siehe Listing:[*]), kann man feststellen, daß im Formular Änderungen vorgenommen wurden:
\lstinputlisting[caption={Sessionmanagement: Quelltext des Skriptes
}]{include/xmpl_session.php} Sessionmanagement: Quelltext des Skriptes

\lstinputlisting[caption={Sessionmanagement: Quelltext der beim Browser ankommt
}]{include/xmpl_session_htmlsource.txt} Sessionmanagement: Quelltext der beim Browser ankommt


previous up next
Rene Morschhauser 2002-02-03