# Sitzungen

Eine Konferenz ist eine Sitzung, bei der viele hineingehen, aber nur wenig herauskommt.
Werner Fink, dt. Kabarettist

Je umfangreicher und dynamischer Ihre Webseite wird, desto stärker wächst wahrscheinlich der Wunsch, verschiedene Variablen über mehrere Seiten hinweg verwenden zu können, etwa bei einem mit Benutzerlogin geschützten Bereich. Auch im Zusammenhang mit personalisierbaren Seiten ist dies wünschenswert. Der einfachste Weg ist die Verwendung von so genannten Sitzungen oder Sessions.

# Was sind Sessions?

Seit PHP 4 können Sie mit Sessions eine beliebige Anzahl von Variablen einzelnen Benutzern zuordnen. Dies funktioniert dadurch, dass ein zufälliger 32 Bit großer Schlüssel generiert wird, der zur Identifikation des Benutzers verwendet wird – die so genannte Session-ID. Wurde eine Session registriert, wird bei jedem Aufruf einer Seite die vorherige Arbeits- bzw. Variablenumgebung wiederhergestellt. Variablen, die in einem anderen Script definiert wurden, stehen dann in den nachfolgenden Scripts zur Verfügung, und zwar so lange, wie die Browsersitzung des Benutzers auf der Webseite dauert. Verlässt der Benutzer die Seite, wird auch die Arbeitsumgebung wieder gelöscht.

PHP kennt zwei Sitzungsarten: automatische und implizite. Automatische Sitzungen werden erzeugt, wenn die PHP-Option session.auto_start in der php.ini auf 1 gesetzt wurde. Die implizite Variante verlangt das Ausführen der Funktion session_start oder session_register.

Dies bedeutet jedoch nicht, das gespeicherte Daten nur von einem Benutzer betrachtet werden können. Sie müssen beim Speichern und Anzeigen von sensiblen Daten also vorsichtig vorgehen, wenn es sich um sensible Daten handelt, die unter Umständen Ihnen oder dem Benutzer schaden könnten (Administrationspasswörter, Bankverbindung des Kunden oder Ähnliches).

Sicherer wird eine Sitzung durch die Verwendung von Session-Cookies, in denen die Session-ID gespeichert wird. Dadurch wird es schwerer, eine Session-ID zu kopieren bzw. zu erbeuten (wird sie z. B. über die URI übergeben, ist sie immer in der Adressleiste des Browsers sichtbar). Da Cookies jedoch mindestens eine Gültigkeitsdauer besitzen, die der Dauer der Sitzung entspricht, ist auch diese Methode nicht vollends sicher. Der Benutzer muss alle Browserfenster schließen, damit ein Cookie, das nur für die aktuelle Sitzung Gültigkeit besitzt, auch wirklich auf dem Client-Rechner gelöscht wird.

Darüber hinaus ist es jedoch auch möglich, Session-Cookies über das Netzwerk zu »erschnüffeln« und weiterzuverwenden. Es gibt jedoch auch Proxy-Server, die Cookies protokollieren (Namen, Wert, Gültigkeitsdauer etc.).

Wenn Sie jedoch mit Sessions bei sensiblen Daten vorsichtig umgehen (z. B. bei der Verwendung einer sicheren Verbindung mittels SSL), ist die Gefahr eines Schadens zwar nicht ausgeschlossen, wird aber beträchtlich verringert.

# Session erzeugen

Um eine Session zu erzeugen, benötigen Sie die Funktion session_start. Diese Funktion erwartet zwar keine Parameter, gibt aber TRUE zurück, wenn die Session erfolgreich registriert werden konnte.

bool session_start(void)

Nachdem eine Session gestartet wurde, liefert die Funktion session_id den 32 Bit großen Schlüssel zurück.

string session_id([string sid])

Optional können Sie an diese Funktion auch einen selbst generierten Schlüssel übergeben, wodurch der aktuelle überschrieben wird.

<?php

  $result = session_start();
  if($result)
  {
    echo "Die Session wurde erfolgreich gestartet!<br>\n";
    echo "Session-ID: ",session_id();
  }
  else
  {
    echo "Die Session konnte nicht initialisiert werden!";
  }

?>

Listing 8.1: Starten einer Session und Ausgabe der Session-ID

Wichtig ist, dass Sie session_start vor jeglicher Ausgabe im Browser ausführen. Nur dadurch wird automatisch ein Session-Cookie auf dem Client-Rechner abgelegt. Der Rückgabewert der Funktion session_start wird in Listing 8.1 in der Variablen $result gespeichert und in der anschließenden if-Anweisung auf den Wert TRUE überprüft. Wurde die Session gestartet ($result entspricht TRUE), wird die Session-ID mit der Funktion session_id ausgegeben.

Diese Session bleibt nun so lange erhalten, bis der Benutzer den Browser schließt. Rufen Sie das Script aus Listing 8.1 einfach mal in Ihrem Browser auf, und aktualisieren Sie die Seite mehrmals. Sie erhalten jedes Mal die gleiche Session-ID. Sobald Sie den Browser jedoch schließen und das Script danach erneut aufrufen, wird eine neue Session-ID ausgegeben.

# Mit Variablen arbeiten

Das nachfolgende Beispiel besteht aus zwei Listings, aus Listing 8.2 und aus Listing 8.3.

<?php

  session_start();
  session_register("nummer");
  session_register("name");
  $nummer = "404";
  $name = "Benutzer";
  echo "<a href=\"list8.3.php\">Weiter</a>";

?>

Listing 8.2: Initialisierung der Session

<?php

  session_start();
  echo "Hallo $name! Ihre Nummer ist $nummer.";

?>

Listing 8.3: Ausgabe der in Listing 8.2 definierten Variablen

In Listing 8.2 wird zu Beginn eine Session initialisiert. Anschließend folgen zwei Aufrufe der Funktion session_register. Als Parameter erwartet diese Funktion einen oder mehrere Variablenbezeichner (ohne Dollarzeichen). An diese Funktion übergebene Variablen werden in der Arbeitsumgebung registriert und stehen fortan in jedem Script zur Verfügung. Die Funktion gibt TRUE zurück, wenn die Variable erfolgreich registriert werden konnte.

bool session_register(mixed name [, mixed ...])

Dabei ist es egal, ob Sie die Namen von normalen Variablen oder von Arrays übergeben. Beide Typen sind erlaubt. Zum Schluss wird in Listing 8.2 noch ein Link zur Datei list8.3.php ausgegeben.

In Listing 8.3 wird die Session wieder initialisiert, und anschließend werden die beiden registrierten Variablen $name und $nummer ausgegeben. Die Ausgabe des Listing 8.3 lautet:

Hallo Benutzer! Ihre Nummer ist 404.

Der Ablauf ist sehr simpel. Zuerst wird in Listing 8.2 eine neue Session initialisiert, und zusätzlich werden noch ein paar Variablen definiert. Sobald nun in ein anderes Script gewechselt wird, in dem zu Beginn die Session mit session_start geladen wird, stehen alle zuvor mit session_register registrierten Variablen zur Verfügung. Es ist also egal, ob Sie eine neue Session starten oder eine existierende Session lesen möchten, Sie müssen zu Beginn immer die Funktion session_start aufrufen.

Um eine Variable wieder zu löschen, müssen Sie die Funktion session_unregister benutzen. Als Parameter müssen Sie nur den Variablennamen ohne Dollarzeichen übergeben. Wurde die Variable erfolgreich gelöscht, liefert die Funktion TRUE zurück.

bool session_unregister(string name)

# Session beenden

Bei vielen Anbietern von Webdienstleistungen, z. B. E‑Mail oder Online-Banking, sehen Sie oft einen Link mit der Aufschrift »Logout«. Bei einem Klick darauf wird die aktuelle Session beendet. Die Funktion, die dies bewirkt, ist session_destroy. Wurde die Session erfolgreich beendet, gibt die Funktion TRUE zurück.

bool session_destroy(void)

Ein Beispiel:

<?php

  session_start();
  echo session_id();
  session_destroy();

?>

Listing 8.4: Session beenden

Mehr, als eine Session zu initialisieren, die Session-ID auszugeben und die Session danach zu beenden, macht das Script aus Listing 8.4 nicht.

# Weitere Session-Funktionen

Zur Überprüfung, ob eine Variable in der Session registriert wurde, können Sie die Funktion session_is_registered verwenden. Als Parameter erwartet sie den Variablennamen, und sie liefert TRUE zurück, wenn die Variable registriert wurde.

bool session_is_registered(mixed name)

Die Funktion session_get_cookie_params liefert die Session-Cookie-Parameter als Array zurück.

array session_get_cookie_params(void)

Das zurückgegebene Array enthält folgende Elemente:

Schlüssel Erklärung
lifetime Lebensdauer des Cookies
path Pfad, unter dem Informationen gespeichert sind
domain Domain des Cookies
secure Darf das Cookie nur über eine sichere Verbindung übertragen werden?

Tabelle 8.1: Schlüssel des von session_get_cookie_params zurückgegebenen Arrays

Mit der Funktion session_set_cookie_params können Sie hingegen Eigenschaften des Cookies setzen.

void session_set_cookie_params(int lifetime[, string path [, string domain [, bool secure]]])

# Zusammenfassung

  • Mit der Funktion session_start wird entweder eine Session initialisiert oder eine existierende Session geladen.
  • Variablen werden mit der Funktion session_register in der Arbeitsumgebung gespeichert.
  • Mit session_register registrierte Variablen stehen als globale Variablen im Script zur Verfügung, wenn zuvor session_start ausgeführt wurde.
  • Eine Session kann mit session_destroy beendet werden.

# Fragen und Übungen

  1. Mit welcher Funktion können Sie eine in der Arbeitsumgebung registrierte Variable löschen?
  2. Schreiben Sie ein Script, das die Haltbarkeitsdauer eines Session-Cookies um 7 Tage verlängert.
  3. Schreiben Sie ein Script, das dem Benutzer die Eingabe eines Benutzernamens und eines Passwortes ermöglicht, und übertragen Sie diese Daten an das Script. Wurden die Daten übertragen, sollen der richtige Benutzername und das richtige Passwort aus einer Datei ausgelesen werden und mit den vom Benutzer eingegebenen Werten verglichen werden (der Einfachheit halber sollte die Datei ein PHP-Script sein, das die Benutzerdaten als Array zur Verfügung stellt). Sind die Werte gleich, soll eine Session erzeugt und ein Link ausgegeben werden, der zu einer neuen, beliebigen Seite führt. Andernfalls soll das HTML-Formular erneut angezeigt werden.