PHP: Session-Verwaltung programmieren

Die Besucher einer Webseite sind anonym. Allenfalls über die IP lassen sich Daten über die Herkunft eines Benutzers und seine Identität ermitteln. Doch sobald irgendwo ein Proxy sitzt oder ein Router mit IP-Maskierung, ist die Identität dahin.

Schlimmer noch: Nach jedem Seitenabruf wird die Verbindung zwischen Client und Server unterbrochen. Jeder erneute Abruf baut eine neue Verbindung auf. Bei nicht interaktiven Webseiten stört das niemanden. Doch sobald man auch nur grundlegende Funktionen für Online-Shopping oder komfortable Benutzerführung einbauen möchte braucht man irgend etwas, um einen Benutzer auch über mehrere Dokumente hinweg eindeutig zu identifizieren.

Ein Weg führt über Handarbeit mit Cookies oder selbst gebauten URL-Parametern. Der andere Weg ist einfacher: PHP hat ein Session-Management eingebaut, das erlaubt, Variablen über mehrere Web-Seiten hinweg zu verwenden. Je nach Browser-Konfiguration verwendet das Session-Management Cookies oder eine über die Variable SID an die URL angehängte Session ID.

Die Session-IDs wiederum kennzeichnen ein Set an Variablen, das PHP in einem eigens dafür vorgesehenen Verzeichnis speichert.

Dieses Verzeichnis zum Speichern der Sessions wird in der PHP.INI gesetzt. Die zugehörige Variable heißt session.save_path und ist per Default auf /tmp gesetzt. Wenn dieses Verzeichnis öffentlich zugänglich ist, bildet es einen Gefahrenpunkt. Hacker könnten versuchen, sich die Daten aus diesem Verzeichnis zu angeln.

Alternativ können Sie mit der Anweisung session_save_path() während des Programmablaufs ein Verzeichnis bestimmen.

Variablen in einer Sitzung speichern

Ein einfaches Skript zeigt das Prinzip der Session-Verwaltung. Zuerst starten Sie eine neue Sitzung mit session_start(). Hierbei sieht PHP nach, ob bereits eine Sitzung für den Client erzeugt wurde. Falls nein, erzeugt er eine neue. Falls ja, übernimmt er die Daten der bereits existierenden Sitzung.

Um innerhalb der Sitzung eine Variable zu speichern, wird diese registriert. Dies geschieht über session_register(varname). An Stelle von varname steht der Name der Variable, die gespeichert werden soll, in Anführungszeichen.

Ein Beispiel:

<?

session_start();

$name="Hubert Meier";

session_register("name");

?>

<a href=weiter.php>Weiter</a>

Die Variable $name erhält den Wert “Hubert Meier” und wird in der nachfolgenden Zeile registriert. Wichtig: Es wird der Name der Variable registriert, nicht die Variable selbst. session_register($name) wäre also falsch.

Um das Beispiel auszuprobieren, brauchen Sie noch eine Datei weiter.php. Die sieht so aus:

<?

session_start();

echo "Hallo $name<br>";

?>

Beim Klick auf Weiter erscheint dann eine kurze Begrüßung für Hubert Meier.

Wichtig ist, dass auf jeder Seite session_start() aufgerufen wird. Damit werden alle für die Session gespeicherten Variablen als global für das Skript definiert. Die gleiche Aufgabe erledigt session_register(). Diese Funktion impliziert session_start() und holt bei Bedarf ebenfalls alle vorhandenen Variablen in das Skript. Dieses Beispiel registriert zwei Variablen:

<?

session_start();

$name="Hubert Meier";

$strasse="Mühlenweg 5";

session_register("name");

session_register("strasse");

?>

<a href=weiter.php>Weiter</a>

Das Skript weiter.php sieht so aus:

<?

//Nur $name wird registriert

session_register("name");

echo "Hallo $name<br>";

//aber $strasse kommt mit

echo "aus $strasse";

?>

Zusatz-Sitzung

Unabhängig von den Session-Variablen lassen sich Daten auch auf herkömmlichem Weg von Dokument zu Dokument transportieren, zum Beispiel in der URL:

<?

session_start();

$name="Hubert Meier";

 

session_register("name");

 

?>

<a href=weiter2.php?wert=10>Weiter</a>

Die Datei weiter2.php sieht so aus:

<?

session_register("name");

echo "Hallo $name<br>";

echo "Per URL übergeben: $wert=$wert";

?>

Beim Test mit dem Browser erscheinen sowohl der in der Session gespeicherte Namen wie auch die URL übergebene Variable. Falls der Client keine Cookies annimmt, hängt PHP die Session-ID einfach hinter die vom Programmierer definierten Variablen in der URL.

Arrays in Session speichern

Ebenso wie einfache Variablen lassen sich auch Arrays in einer Sitzung speichern. Das Beispiel:

<?

session_start();

$a[]="Hans";

$a[]="Otto";

$a[]="Herbert";

session_register("a");

?>

<a href="arr2.php">Test</a>

Das zugehörige Programm arr2.php liest in diesem Beispiel einen Wert aus dem Array:

<?

session_start();

echo $a[1];

?>

Session-Variablen neu belegen

Ohne Probleme lassen sich im laufenden Betrieb Session-Variablen mit neuen Werten versehen. Die folgenden drei kleinen Beispiele verdeutlichen das Prinzip. Die Datei var1.php:

<?

session_start();

$text="Hallo Erde!";

session_register("text");

echo "Variable $text ist $text<br>";

?>

<a href="var2.php">Testen</a>

Wichtig ist hier: Wenn die Variable innerhalb der Session zum ersten Mal auftaucht, muss Sie mit session_register() gesetzt werden. Die weiteren Dateien kommen mit session_start() aus.

var2.php sieht so aus:

<?

session_start();

echo "Variable $text ist $text<br>";

$text="Hallo Mond!";

echo "Variable $text ist jetzt $text<br>";

?>

<a href="var3.php">Testen</a>

Wichtiges Detail: Die Variable $text darf ihren neuen Wert erst nach session_start() zugewiesen bekommen. Anderenfalls würde die Variable von der mit session_start() eingelesenen Session-Variable überschrieben. Die dritte Datei, var3.php zeigt das Ergebnis:

<?

session_start();

echo "Variable $text ist $text<br>";

?>

<a href="var1.php">Testen</a>

Anwendungsbeispiel: History-Funktion

Speziell wenn Besucher auf mit Datenbanken generierten Web-Seiten unterwegs sind, ist eine History-Funktion sinnvoll. Die speichert alle besuchten Dokumente in einer Liste und stellt sie per Knopfdruck bereit. Das erleichtert die Navigation auf so einer Seite. Damit die History-Funktion auf allen Dokumenten zur Verfügung steht, packt man sie in eine Header-Datei. Das folgende Beispiel zeigt einen grundlegenden Ansatz, eine solche persönliche History-Funktion zu programmieren.

<? session_start();

session_register(history);

$history[]=$REQUEST_URI;

$history=array_unique($history);

?>

<a href="show_hist.php">History anzeigen</a><br>

Speichern Sie die Datei unter dem Namen hist_head.php, um sie später von beliebigen anderen Dateien aus einzubinden.

Nach dem Start liest das Programm das Array $history ein oder registriert es neu. Danach wird der Inhalt der Server-Variablen $REQUEST_URI als neuer Eintrag dem Array hinzugefügt. Diese Variable enthält den Pfad des gerade aufgerufenen Dokuments relativ zum Root-Verzeichnis des Web-Servers. Eventuelle Parameter sind ebenfalls eingeschlossen. Falls Sie nur die Parameter speichern wollen, verwenden Sie die Server-Variable $QUERY_STRING.

Die Funktion array_unique() wirft alle doppelten Einträge aus dem Array. Wird ein Dokument also mehrmals aufgerufen, erscheint nur der jeweils letzte Aufruf in der Array-Liste. Das spart Platz und erhält die Übersicht.

Die letzte Zeile gibt einen Link auf die History-Liste aus. Diese Datei heißt show_hist.php und sieht so aus:

<? session_start();

echo "Die von Ihnen aufgerufenen Dokumente:<br>";

foreach ($history as $eintrag)

{ echo "<a href=$eintrag>$eintrag</a><br>";

}

?>

Das Array wird in diesem Dokument eingelesen. Allerdings erhält das Array keinen weiteren Eintrag — das ist im Falle der History-Seite unsinnig.

Der Schleifenbefehl foreach kopiert nacheinander jedes Element des Arrays in eine temporäre Variable $eintrag. Die schreibt einen Hyperlink als Verweis auf die zuvor besuchte Seite.

Um die History auszuprobieren schreiben Sie hist_beisp1.php:

<? include("hist_head.php");?>

<p>Eine Beispielseite.</p>

<a href="hist_beisp2.php">Beispiel 2</a>

und hist_beisp2.php

<? include("hist_head.php");?>

<p>Noch eine Beispielseite</p>

<a href="hist_beisp1.php">Beispiel 1</a>

Die beiden Dateien laden die History-Funktion als Header und zeigen danach einen kurzen Text. Mit einem Klick auf den von der Header-Datei erzeugten Link History anzeigen gelangt der Leser dann zur Anzeige der Liste.

Mit ein wenig Ausbau – etwa dem zusätzlichen Speichern der Titelinformation einer Seite – lässt sich die History-Funktion vor allem auf Servern verwenden, die keine feste Struktur vorgeben.

Ähnliche Beiträge