Apache/14 CGI/4 Session-Verwaltung
14.4 Session-Verwaltung
- Session-Verwaltung mit mod_session
HTTP ist ein zustandsloses (stateless) Protokoll - jedes Anfrage/Antwort-Paar steht für sich allein und wird weder von einer vorherigen Anfrage beeinflusst, noch beeinflusst es seinerseits eine nachfolgende. Für komplexere Webanwendungen ist dies ein Problem, weil solche Anwendungen sich bestimmte Zustände und Einstellungen über beliebig viele Anfragen hinweg merken müssen - denken Sie beispielsweise an das Warenkorbsystem eines Online-Shops oder an benutzerdefinierte Einstellungen für Aussehen und Inhalte bestimmter Websites.
Um dieses Problem zu lösen, wurden im Prinzip zwei Wege gefunden: Cookies und Sessions. Cookies werden in Form des HTTP-Headers Set-Cookie mit einer Server-Antwort mitgeschickt und vom Client gespeichert. Bei der nächsten Anfrage an denselben Server wird das Cookie im Header Cookie wieder zurückgeschickt. Der Vorteil von Cookies besteht darin, dass diese auch über eine Browser-Sitzung hinaus gültig bleiben können. Ein Nachteil ist, dass Benutzer das Speichern von Cookies in ihren Browsern ausschalten oder Cookies gezielt löschen können - und da Cookies auch zum Usertracking durch Werbetreibende verwendet werden, gibt es viele User, die dies tun.
Sessions sind dagegen serverseitig: Die Webanwendung erzeugt einen eindeutigen Schlüssel, die Session-ID, und speichert mithilfe dieser ID die Daten für eine bestimmte Benutzersitzung. Wenn der Benutzer Cookies zulässt, werden diese oft als Speichermechanismus für Session-Daten verwendet; andernfalls muss die Session-ID Teil der URL oder des Query-Strings jeder Anfrage an den Server sein.
Bisher waren Sessions ausschließlich Sache der jeweiligen Webanwendung; im nächsten Kapitel wird dies am Beispiel von PHP gezeigt. Apache 2.3/2.4 bietet erstmals Module für die Verwaltung von Sessions auf Webserver-Ebene: mod_ session und einige Hilfsmodule. Das in Kapitel 9, Authentifizierung, Autorisierung und Zugriffskontrolle, besprochene Modul mod_auth_form benötigt mod_ session; außerdem können Sie die Sessions für eigene CGI-Skripte oder Webanwendungen verwenden (deshalb wird das Modul auch in diesem Kapitel beschrieben).
Session-Verwaltung mit mod_session 14.4
14.4.1 Ein einfaches Konfigurationsbeispiel
Um Sessions zu verwenden, muss die Funktionalität zunächst aktiviert werden - dafür ist die Direktive Session zuständig. Um in die Session zu schreiben, muss ein HTTP-Erweiterungs-Header gesetzt werden, der mit SessionHeader festgelegt wird. Schließlich wird der Speicherort bestimmt - am einfachsten zu konfigurieren ist ein Cookie, dessen Name mithilfe der Direktive SessionCookieName aus dem Modul mod_session_cookie festgelegt wird. Das folgende Beispiel verwendet den Session-Header-Namen X-Replace-Session und den Cookie-Namen session:
Session On SessionHeader X-Replace-Session SessionCookieName session path=/
Nun können Sie in einem CGI-Skript beispielsweise folgendermaßen in die Session schreiben:
#!/usr/bin/perl -w use strict; print "Content-type: text/html\n"; print "X-Replace-Session: key1=val1&key2=val2\n"; print "\n"; # Beginn des HTTP-Bodys ...
Wie Sie an der Zeile print "X-Replace-Session ..." erkennen können, werden Schlüssel-Wert-Paare in die Session geschrieben; das Format entspricht einem Query-String.
Die einfachste Möglichkeit, Daten aus der Session lesbar zu machen, besteht darin, sie in Form der Umgebungsvariablen HTTP_SESSION bereitzustellen. Dazu wird die Direktive SessionEnv aktiviert:
SessionEnv On
In der Einleitung des vorangegangenen Abschnitts wurde bereits beschrieben, wie in verschiedenen Programmiersprachen auf Umgebungsvariablen zugegriffen wird - in Perl würden Sie beispielsweise $ENV{'HTTP_SESSION'} schreiben, in PHP $_SERVER['HTTP_SESSION']. Wie sich ein Query-String zerlegen und verarbeiten lässt, erfahren Sie im Abschnitt Formulardaten einlesen.
Sessions können statt in Cookies auch mittels DBD in einer Datenbank gespeichert werden; dafür ist das Modul mod_session_dbd zuständig. Außerdem können Sie die Session-Daten mithilfe von mod_session_crypto verschlüsseln. Näheres erfahren Sie in der Beschreibung der einzelnen Direktiven.
14.4.2 Session-Direktiven
Im Folgenden werden die einzelnen Direktiven der Module mod_session, mod_ session_cookie, mod_session_dbd und mod_session_crypto beschrieben.
Session Die Session-Funktionalität aktivieren
Seit Version 2.3 Modul mod_session Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax Session On|Off Standardwert Off
Setzen Sie diese Direktive auf On, um die Verwendung einer Session für den gewünschten Kontext grundsätzlich zu aktivieren. Beachten Sie, dass andere Direktiven wie SessionHeader oder SessionCookieName benötigt werden, um tatsächlich einen praktischen Nutzen davon zu haben.
SessionEnv Den Inhalt der Session in der Umgebungsvariablen HTTP_SESSION bereitstellen
Seit Version 2.3 Modul mod_session Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionEnv On|Off Standardwert Off
Wenn Sie diese Direktive auf On setzen, wird der Inhalt der Session in der Umgebungsvariablen HTTP_SESSION zur Verfügung gestellt. Dies ist die einfachste Art, auf die Session-Daten zuzugreifen.
SessionExclude URL-Pfade aus der Session-Verwaltung ausschließen
Seit Version 2.3 Modul mod_session Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig)
Session-Verwaltung mit mod_session 14.4
Syntax SessionExclude Pfad Standardwert none
Mit dieser Direktive können Sie einen URL-Pfad angeben, für den die SessionKonfiguration ignoriert wird. Dies ermöglicht es Ihnen, statische Bestandteile dynamischer Webanwendungen ohne Session zu betreiben, sodass diese beispielsweise problemlos gecached werden können.
Das Verfahren ähnelt der Angabe eines Pfads für Cookies. Dieser wird jedoch nicht automatisch gesetzt, sondern muss über die Option path der Direktive SessionCookieName explizit angegeben werden.
Das folgende Beispiel richtet eine Session für den URL-Pfad /myapp ein, schließt aber das Unterverzeichnis static aus:
<Location /myapp> Session On SessionEnv On SessionHeader X-Replace-Session SessionCookieName session path=/myapp SessionExclude /myapp/static </Location>
SessionExclude hat Vorrang vor der ebenfalls verfügbaren Direktive SessionInclude.
SessionHeader Name des HTTP-Headers für die Session
Seit Version 2.3 Modul mod_session Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionHeader Name Standardwert none
Diese Direktive gibt den Namen des HTTP-Headers an, in den die Session-Daten geschrieben werden. Sie sollten einen Erweiterungs-Header mit dem Präfix Xverwenden. Beispiel:
SessionHeader X-Replace-Session
SessionInclude URL-Pfad, für den die Session gültig ist
Seit Version 2.3 Modul mod_session Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionInclude Pfad Standardwert alle URLs
Diese Direktive ist die Umkehrung von SessionExclude: Wenn Sie sie setzen, wird die Session nur für den angegebenen URL-Pfad innerhalb des Konfigurationskontextes gesetzt. Das folgende Beispiel konfiguriert die Session innerhalb des URL-Pfads /mysite, verwendet sie aber nur innerhalb von /mysite/scripts:
<Location /mysite> Session On SessionEnv On SessionHeader X-Replace-Session SessionCookieName session path=/mysite/scripts SessionInclude /mysite/scripts </Location>
SessionMaxAge Gültigkeitsdauer von Sessions
Seit Version 2.3 Modul mod_session Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionMaxAge Sekunden Standardwert 0
Die Direktive SessionMaxAge definiert eine Anzahl von Sekunden seit der letzten Änderung der Session, nach der diese ungültig wird. Dies ist beispielsweise nützlich, wenn die Session im Zusammenhang mit formularbasierter Authentifizierung verwendet wird (siehe Kapitel 9, Authentifizierung, Autorisierung und Zugriffskontrolle) - ein Benutzer, der über einen gewissen Zeitraum nicht aktiv ist, kann so automatisch ausgeloggt werden. Das folgende Beispiel stellt eine Stunde ein:
Session-Verwaltung mit mod_session 14.4
SessionMaxAge 3600
Mit dem Standardwert 0 sind Sessions beliebig lange gültig.
SessionCookieName Name des RFC-2109-Cookies, in dem die Session-Daten gespeichert werden
Seit Version 2.3 Modul mod_session_cookie Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionCookieName Name Attribute Standardwert none
Wenn Sie diese Direktive setzen, die durch das Modul mod_session_cookie bereitgestellt wird, dann werden die Session-Daten clientseitig in einem RFC2109-Cookie mit dem angegebenen Namen zwischengespeichert. Neben dem Namen können Sie einige optionale, durch Semikolon getrennte Attribute angeben, die in Kapitel 2, Funktionsweise von Webservern, in der Beschreibung des HTTP-Headers Set-Cookie erläutert wurden.
Das folgende Beispiel setzt ein Cookie mit dem Namen session , dem Pfad /myapp und der Domain app.mynet.de:
SessionCookieName session path=/myapp;domain=app.mynet.de
SessionCookieName2 Name des RFC-2965-Cookies, in dem die Session-Daten gespeichert werden
Seit Version 2.3 Modul mod_session_cookie Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionCookieName2 Name Attribute Standardwert none
Entspricht der Beschreibung von SessionCookieName, verwendet jedoch eine modernere Cookie-Implementierung gemäß RFC 2965.
SessionCookieRemove Session-Cookies aus den HTTP-Headern eingehender Anfragen entfernen
Seit Version 2.3 Modul mod_session_cookie Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionCookieRemove On|Off Standardwert Off
Wenn Sie Apache als Reverse-Proxy verwenden, sollten Sie die Session-Cookies unter Umständen nicht an den Backend-Server weitergeben. Dazu können Sie diese Direktive explizit auf On setzen.
SessionDBDCookieName Name des RFC-2109-Cookies, in dem die Session-ID gespeichert wird
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDCookieName Name Attribute Standardwert none
Wenn Sie die Session-Daten mittels DBD in einer SQL-Datenbank speichern, kann diese Direktive verwendet werden, um die Session-ID in einem Cookie zu speichern. Syntax und Funktionsweise entsprechen ansonsten SessionCookieName.
SessionDBDCookieName2 Name des RFC-2965-Cookies, in dem die Session-ID gespeichert wird
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDCookieName2 Name Attribute Standardwert none
Wie SessionDBDCookieName, aber mit moderneren RFC-2965-konformen Cookies.
Session-Verwaltung mit mod_session 14.4
SessionDBDCookieRemove Session-ID-Cookies aus den Headern eingehender Anfragen entfernen
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDCookieRemove On|Off Standardwert Off
Entspricht SessionCookieRemove, gilt jedoch für die durch mod_session_dbd gesetzten Session-ID-Cookies.
SessionDBDDeleteLabel SQL-Abfrage zum Entfernen von Sessions aus der Datenbank
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDDeleteLabel Label Standardwert deletesession
Die SessionDBD*Label-Direktiven geben die Label-Namen von SQL-Abfragen an, die für die verschiedenen Session-Datenbankoperationen verwendet werden. Die Labels beziehen sich auf Abfragen, die zuvor mittels DBDPrepareSQL vorbereitet wurden (siehe Kapitel 9, Authentifizierung, Autorisierung und Zugriffskontrolle).
Das folgende Beispiel definiert MySQL-basierte Abfragen für alle Session-Aufgaben. Die SessionDBD*Label-Direktiven sind eigentlich nicht notwendig, weil jeweils die Standard-Label-Namen verwendet werden; sie wurden nur der Vollständigkeit halber hinzugefügt:
DBDriver mysql DBDParams "dbname=sessions user=sessionuser password=PASSWORT host=localhost" DBDPrepareSQL "DELETE FROM session WHERE key = '%s'" \ deletesession DBDPrepareSQL "UPDATE SESSION SET value = '%s', expiry = %d WHERE key = '%s'" \ updatesession
DBDPrepareSQL "INSERT INTO session (value, expiry, key) values ('%s', %d, '%s')" \ insertsession DBDPrepareSQL "SELECT value FROM session WHERE key = '%s' AND (expiry = 0 OR expiry > %d)" \ selectsession SessionDBDDeleteLabel deletesession SessionDBDUpdateLabel updatesession SessionDBDInsertLabel insertsession SessionDBDSelectLabel selectsession
Ein Problem besteht zurzeit noch darin, dass die Datenbank im Lauf der Zeit mit abgelaufenen Sessions angefüllt wird. Sie sollten einen externen Cronjob einrichten, der diese von Zeit zu Zeit löscht. Analog zu den obigen Beispielen könnte eine entsprechende SQL-Abfrage so aussehen:
DELETE FROM session WHERE expiry != 0 AND expiry < %d
SessionDBDInsertLabel SQL-Abfrage zum Einfügen von Sessions in die Datenbank
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDInsertLabel Label Standardwert insertsession
Mit der durch diese Direktive angegebenen SQL-Query werden neue Sessions in die Datenbank geschrieben. Nähere Infos und ein Beispiel finden Sie in der Beschreibung von SessionDBDDeleteLabel.
SessionDBDDeleteLabel SQL-Abfrage zum Entfernen von Sessions aus der Datenbank
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDDeleteLabel Label Standardwert deletesession
Session-Verwaltung mit mod_session 14.4
SessionDBDPerUser Benutzernamenbasierte Sessions
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDPerUser On|Off Standardwert Off
Wenn Sie diese Direktive auf On setzen und ein Benutzer eingeloggt wird, dann wird der Session-Key auf der Basis des jeweiligen Benutzernamens erzeugt. Andernfalls wird die Direktive ignoriert.
SessionDBDSelectLabel SQL-Abfrage zum Lesen von Sessions aus der Datenbank
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDSelectLabel Label Standardwert selectsession
Mit SessionDBDSelectLabel geben Sie die SQL-Abfrage zum Lesen (Auswählen) von Session-Daten aus der Datenbank an - für nähere Informationen und ein Beispiel siehe SessionDBDDeleteLabel.
SessionDBDUpdateLabel SQL-Abfrage zum Ändern von Sessions in der Datenbank
Seit Version 2.3 Modul mod_session_dbd Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionDBDDeleteLabel Label Standardwert deletesession
Die durch diese Direktive angegebene SQL-Abfrage wird zum Ändern existierender Sessions verwendet. Siehe SessionDBDDeleteLabel für Details.
SessionCryptoPassphrase Passphrase zur Verschlüsselung der Session-Daten
Seit Version 2.3 Modul mod_session_crypto Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionCryptoPassphrase Passphrase [Passphrase ...] Standardwert none
Wenn Sie Session-Daten in clientseitigen Cookies speichern, können Sie diese optional verschlüsseln. Dazu wird das Modul mod_session_crypto verwendet. Mit der Direktive SessionCryptoPassphrase wird die Passphrase zur symmetrischen Verschlüsselung angegeben. Wenn Sie mehrere Passphrasen angeben, wird die erste zur Verschlüsselung verwendet und alle in der Liste für den Versuch der Entschlüsselung. Sie können eine Schlüsselrotation durchführen, indem Sie von Zeit zu Zeit einen weiteren Schlüssel am Ende der Liste anfügen und den vordersten entfernen.
Die Passphrasen sollten möglichst lang sein und aus zufälligen Zeichenfolgen bestehen. Hier ein komplettes Konfigurationsbeispiel:
Session On SessionEnv On SessionCookieName session path=/ SessionHeader X-Replace-Session SessionCryptoPassphrase \ "}X9FJ`rrS\~rIP6[ihT;@SL9K~^[<nOAv:T8mL" \ "kkDQ-En}Y:nC$qjUC==<\zCeH}$spFEtx`8) Y" \ ">qMgBb8=y&={eUK05hs.cypSm<Ze|Bc/c8r'Ik"
SessionCryptoDriver Treiber, der zur Verschlüsselung der Sessions verwendet wird
Seit Version 2.3 Modul mod_session_crypto Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionCryptoDriver Name [Parameter[=Wert] ...] Standardwert none
Wenn Sie Apache mit verschiedenen Verschlüsselungstreibern kompiliert haben, können Sie mithilfe dieser Direktive auswählen, welcher verwendet wird. Das
Grundlagen der CGI-Programmierung 14.5
folgende Beispiel verwendet den Treiber NSS (Network Security Services, siehe https://www.mozilla.org/projects/security/pki/nss/):
SessionCryptoDriver nss
SessionCryptoCipher Verschlüsselungsverfahren für die Session-Daten
Seit Version 2.3 Modul mod_session_crypto Kontext Server, <VirtualHost>, <Directory>, <Location>, <Files>, .htaccess (AuthConfig) Syntax SessionCryptoCipher Name Standardwert aes256
Diese Direktive wählt das konkrete Verschlüsselungsverfahren für die SessionDaten aus. Die möglichen Werte sind:
- 3des192
- aes128
- aes192
- aes256
Welche von diesen Werten tatsächlich zur Verfügung stehen, hängt gegebenenfalls vom gewählten Treiber ab (SessionCryptoDriver).