Die Unterstützung von Sessions in PHP bietet die Möglichkeit, bestimmte
Daten während einer Folge von Aufrufen Ihrer Website festzuhalten. Damit
können Sie persönlichere Applikationen erstellen und Ihre Website
ansprechender gestalten.
Einem Besucher wird beim Aufruf Ihrer Website eine eindeutige ID, die
sogenannte Session-ID, zugeordnet. Diese wird entweder benutzerseitig in
einem Cookie abgelegt oder in der URL übermittelt.
Die Unterstützung von Sessions erlaubt Ihnen, eine beliebige Anzahl von
Variablen zu registrieren und diese über Anfragen hinweg zu erhalten.
Wenn ein Besucher Ihre Website aufruft, überprüft PHP automatisch (falls
session.auto_start auf 1
gesetzt ist) oder auf Anfrage (explizit durch
session_start() oder implizit durch
session_register()), ob mit der Anfrage schon eine
bestimmte Session-ID gesendet wurde. Wenn dies der Fall ist, wird die
zuvor gespeicherte Umgebung wiederhergestellt.
Achtung
Falls Sie session.auto_start aktivieren,
können Sie keine Objekte in Ihre Session aufnehmen, weil die Definition
der Klasse vor dem Start der Session geladen werden muss, damit die
Objekte in Ihrer Session wiederhergestellt werden.
Alle registrierten Variablen werden serialisiert, nachdem die Anfrage
beendet ist. Registrierte Variablen, die nicht definiert sind, werden als
nicht definiert gekennzeichnet. Auch bei darauffolgenden Zugriffen werden
sie nicht vom Session-Modul definiert, außer der Benutzer definiert sie
später.
Warnung
Einige Datentypen können nicht serialisiert werden, um in Sessions
gespeichert zu werden. Dazu gehören resource-Variablen oder
Objekte mit Ringreferenzen (d.h. Objekte, die eine Referenz auf sich
selbst an andere Objekte übergeben).
Hinweis:
Die Behandlung von Sessions wurde in PHP 4.0.0 eingeführt.
Hinweis:
Bitte beachten Sie beim Arbeiten mit Sessions, dass der Datensatz einer
Session nicht angelegt wird, bevor eine Variable mit der Funktion
session_register() registriert oder dem superglobalen
Array $_SESSION ein neuer Schlüssel hinzugefügt wird.
Das gilt auch dann, wenn eine Session mit der Funktion
session_start() gestartet wurde.
Das Session-Modul bietet keine Garantie dafür, dass Informationen, die Sie
in einer Session speichern, nur vom Benutzer gesehen werden können, der
die Session erzeugt hat. Sie müssen zusätzliche Maßnahmen ergreifen, um
die Integrität der Session ihrer Wichtigkeit entsprechend angemessen aktiv
zu schützen.
Schätzen Sie die Wichtigkeit der Daten ab, die in Ihren Sessions
transportiert werden und treffen Sie zusätzliche Schutzmaßnahmen -- in der
Regel bezahlen Sie dafür mit einer geringeren Benutzerfreundlichkeit. Wenn
Sie z.B. Benutzer vor einfachen Social Engineering Tactics (Anm. des
Übersetzers: Techniken der Ausnutzung menschlicher Schwächen) schützen
wollen, müssen Sie session.use_only_cookies aktivieren.
Cookies müssen dann benutzerseitig auf jeden Fall aktiviert sein, weil
Sessions sonst nicht funktionieren.
Es gibt mehrere Wege, über die eine Sessio-ID an Dritte gelangen kann.
Eine entführte Session-ID ermöglicht diesen, auf alle Daten zuzugreifen,
die mit dieser Session-ID verbunden sind. Erstens sind das URLs, die
Session-IDs enthalten. Wenn Sie auf eine externe Site verweisen, könnte
die URL inklusive Session-ID in den Referrer-Logs der externen Site
gespeichert werden. Zweitens kann ein aktiverer Angreifer Ihren
Netzwerkverkehr abhören. Falls Ihr Netzwerkverkehr nicht verschlüsselt
ist, werden Session-IDs im Klartext über das Netzwerk übertragen. Hier ist
die Lösung, auf Ihrem Server SSL zu implementieren und die Verwendung für
Ihre Benutzer obligatorisch zu machen.
Anforderungen
Diese Erweiterung benötigt keine externen Bibliotheken.
Hinweis:
Optional können Sie für die Speicherung von Sessions die von Ralf S.
Engelschall entwickelte Shared Memory Allocation (mm) verwenden. Sie
müssen dazu » mm herunterladen und
installieren. Für Windows-Plattformen steht diese Option nicht zur
Verfügung. Beachten Sie, dass das Sessionspeicherungs-Modul für mm nicht
dafür garantiert, dass gleichzeitige Zugriffe auf die selbe Session
richtig gesperrt sind. Die Verwendung eines auf Shared Memory basierenden
Dateisystems (wie z.B. tmpfs unter Solaris/Linux oder /dev/md unter BSD)
könnte für die Speicherung von Sessions in Dateien geeigneter sein, weil
sie entsprechend gesperrt sind. Die Session-Daten werden im Hauptspeicher
gespeichert und folglich bei einem Neustart des Webservers gelöscht.
Installation
Die Unterstützung von Sessions ist in PHP standardmäßig aktiviert.
Falls Sie Ihr PHP ohne Unterstützung von Sessions bauen wollen,
müssen Sie bei der Konfiguration die Option --disable-session angeben.
Um für die Speicherung von Sessions die shared memory allocation
(mm) zu benutzen, müssen Sie PHP mit der Option --with-mm[=DIR] konfigurieren.
Die Windowsversion von PHP enthält diese
Erweiterung. Um diese Funktionen zu verwenden, müssen Sie keine zusätzlichen
Erweiterungen aktivieren.
Hinweis:
Standardmäßig werden alle Daten, die zu einer bestimmten Session
gehören, in einer Datei gespeichert, die in dem Verzeichnis liegt,
das durch die INI Option session.save_path bestimmt ist. Für jede
Session wird (unabhängig davon, ob sie überhaupt Daten enthält)
eine Datai erzeugt. Das liegt daran, dass eine Session geöffnet
wird (eine Datei wird erzeugt), ohne dass jemals Daten in diese
Datei geschrieben werden. Beachten Sie, dass es sich bei diesem
Verhalten um einen Nebeneffekt der Beschränkungen beim Arbeiten mit
dem Dateisystem handelt und dass es mit einer benutzerdefinierten
Session-Speicherfunktion (wie z.B. mit einer, die eine Datenbank
verwendet) möglich ist, Sessions nicht zu verfolgen, wenn sie keine
Daten enthalten.
Laufzeit Konfiguration
Das Verhalten dieser Funktionen wird
durch Einstellungen in der php.ini beeinflusst.
Session-Konfigurationsoptionen
Bezeichnung
Grundeinstellung
Änderbar
Changelog
session.save_path
""
PHP_INI_ALL
session.name
"PHPSESSID"
PHP_INI_ALL
session.save_handler
"files"
PHP_INI_ALL
session.auto_start
"0"
PHP_INI_ALL
session.gc_probability
"1"
PHP_INI_ALL
session.gc_divisor
"100"
PHP_INI_ALL
Seit PHP 4.3.2 verfügbar.
session.gc_maxlifetime
"1440"
PHP_INI_ALL
session.serialize_handler
"php"
PHP_INI_ALL
session.cookie_lifetime
"0"
PHP_INI_ALL
session.cookie_path
"/"
PHP_INI_ALL
session.cookie_domain
""
PHP_INI_ALL
session.cookie_secure
""
PHP_INI_ALL
Seit PHP 4.0.4 verfügbar.
session.cookie_httponly
""
PHP_INI_ALL
Seit PHP 5.2.0 verfügbar.
session.use_cookies
"1"
PHP_INI_ALL
session.use_only_cookies
"1"
PHP_INI_ALL
Seit PHP 4.3.0 verfügbar.
session.referer_check
""
PHP_INI_ALL
session.entropy_file
""
PHP_INI_ALL
session.entropy_length
"0"
PHP_INI_ALL
session.cache_limiter
"nocache"
PHP_INI_ALL
session.cache_expire
"180"
PHP_INI_ALL
session.use_trans_sid
"0"
PHP_INI_ALL
PHP_INI_ALL in PHP <= 4.2.3. PHP_INI_PERDIR in PHP < 5. Seit PHP
4.0.3 verfügbar.
session.bug_compat_42
"1"
PHP_INI_ALL
Seit PHP 4.3.0 verfügbar. Wurde in PHP 6.0.0 entfernt.
session.bug_compat_warn
"1"
PHP_INI_ALL
Seit PHP 4.3.0 verfügbar. Wurde in PHP 6.0.0 entfernt.
session.hash_function
"0"
PHP_INI_ALL
Seit PHP 5.0.0 verfügbar.
session.hash_bits_per_character
"4"
PHP_INI_ALL
Seit PHP 5.0.0 verfügbar.
url_rewriter.tags
"a=href,area=href,frame=src,form=,fieldset="
PHP_INI_ALL
Seit PHP 4.0.4 verfügbar.
Weitere Details und die Definitionen der
PHP_INI_*-Konstanten finden Sie im php.ini Einstellungen.
Das Sessionmanagementsystem unterstützt eine Anzahl von
Konfigurationsoptionen, die Sie in Ihrer php.ini setzen können. Wir geben
Ihnen dazu einen kleinen Überblick.
session.save_handler definiert den Namen der
Prozedur, die benutzt wird, um die Daten zu speichern und zurückzuholen,
die mit der Session in Verbindung stehen. Grundeinstellung
files. Bitte beachten Sie, dass einzelne
Erweiterungen ihre eigenen save_handler registrieren
können. Welche Prozeduren registriert sind, kann auf Basis der
jeweiligen Installation mit phpinfo() ermittelt
werden. Siehe auch session_set_save_handler().
session.save_path definiert das Argument, das an die
Speicherprozedur übergeben wird. Wenn Sie die standardmäßige files
Prozedur wählen, ist das der Pfad, unter dem die Dateien erzeugt werden.
Siehe auch session_save_path().
Für diese Anweisung gibt es ein optionales Argument N, das die Anzahl
der Verzeichnisebenen bestimmt, über die Ihre Session-Dateien verteilt
werden. Wird sie zum Beispiel auf '5;/tmp' gesetzt,
kann das das Anlegen einer Session-Datei und Speicherstelle wie
/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If
bewirken. Um N verwenden zu können, müssen Sie alle diese Verzeichnisse
vorher anlegen. In ext/session gibt es für diesen
Zweck ein kleines Shell-Script namens mod_files.sh.
Beachten Sie, dass die automatische 'Müllentsorgung' (garbage
collection) nicht durchgeführt wird, wenn N verwendet wird und größer 0
ist (für weitere Informationen siehe eine Kopie der php.ini). Achten
Sie bei der Verwendung von N außerdem darauf, dass Sie
session.save_path zwischen Anführungsstriche setzen,
weil der Trenner (;) in der php.ini auch für
Kommentare benutzt wird.
Warnung
Wenn Sie ein Verzeichnis gewählt haben, für das jeder Leserechte hat,
wie das z.B. bei /tmp (Grundeinstellung) der Fall ist, könnten andere
Serverbenutzer mit Hilfe der Dateiliste dieses Verzeichnisses Ihre
Sessions entführen.
Hinweis:
Vor PHP 4.3.6 mussten Benutzer von Windows diese Variable ändern, um
die Session-Funktionen von PHP nutzen zu können. Es muss ein gültiger
Pfad, z.B. c:/temp, angegeben werden.
session.serialize_handler definiert den Namen der
Prozedur, die benutzt wird, um Daten zu serialisieren/deserialisieren.
Gegenwärtig werden ein internes PHP-Format (Name php
oder php_binary) und WDDX (name
wddx) unterstützt. WDDX steht nur zur Verfügung, wenn
PHP mit WDDX support kompiliert wurde.
Grundeinstellung php.
session.gc_probability wird in Verbindung mit
session.gc_divisor dazu verwendet, die
Wahrscheinlichkeit zu regeln, mit der die gc (garbage collection)
Routine gestartet wird. Grundeinstellung 1. Siehe
auch session.gc_divisor.
session.gc_divisor definiert gekoppelt mit
session.gc_probability die Wahrscheinlichkeit, mit
der die gc (garbage collection) Routine bei jeder Initialisierung einer
Session gestartet wird. Die Wahrscheinlichkeit errechnet sich aus
gc_probability/gc_divisor. 1/100 bedeutet z.B., dass die GC-Routine bei
jeder Anfrage mit einer Wahrscheinlichkeit von 1% gestartet wird.
Grundeinstellung 100.
session.gc_maxlifetime spezifiziert die Anzahl der
Sekunden, nach denen Daten als 'garbage' ('Müll') betrachtet und
entsorgt werden. Die Speicherbereinigung wird zu Beginn einer Session
durchgeführt.
Hinweis:
Falls sich der Wert von session.gc_maxlifetime in
verschiedenen Scripts unterscheidet, aber sie die Sessiondaten an der
selben Stelle speichern, löscht das Script mit dem kleinsten Wert die
Daten. Verwenden Sie die Anweisung in diesem Fall zusammen mit der
Anweisung session.save_path.
Hinweis:
Falls Sie die standardmäßige dateibasierte Session-Prozedur verwenden,
muss Ihr Dateisystem die Zugriffszeiten (atime) verfolgen. Windows FAT
tut dies nicht. Sie müssen sich daher einen anderen Weg einfallen
lassen, um die 'Müllentsorgung' Ihrer Session zu erledigen, wenn Sie an
ein FAT-Dateisystem gebunden sind oder an irgendein anderes
Dateisystem, das keine atime-Kontrolle bietet. Seit PHP 4.2.3 wird
mtime (modified date) anstatt atime verwendet. Sie werden also keine
Problem mit Dateisystemen haben, bei denen atime nicht zur Verfügung
steht.
session.referer_check enthält die Zeichenkette, auf
die Sie jeden HTTP-Referer überprüfen wollen. Wenn der Referer vom
Client gesendet und die Zeichenkette nicht gefunden wurde, wird die
eingebettete Session-ID als ungültig gekennzeichnet. Grundeinstellung
ist eine leere Zeichenkette.
session.entropy_file gibt den Pfad zu einer externen
Quelle (Datei) an, die bei der Erzeugung einer Session-ID als
zusätzliche Entropiequelle verwendet wird. Beispiele sind
/dev/random oder /dev/urandom, die
auf vielen Unix-Systemen zur Verfügung stehen.
session.use_only_cookies spezifiziert, ob das Modul
nur Cookies verwendet, um die
Session-ID clientseitig zu speichern. Mit Aktivierung dieser Einstellung
wird möglichen Angriffen durch Übermittlung von Session-IDs in URLs
vorgebeugt. Diese Einstellung wurde in PHP 4.3.0 hinzugefügt. Ab PHP 6.0
ist die Grundeinstellung 1 (aktiviert).
session.cookie_lifetime spezifiziert die
Cookie-Lebensdauer, die an den Browser geschickt wird, in Sekunden. Der
Wert 0 bedeutet "bis der Browser geschlossen wird." Grundeinstellung
0. Siehe auch
session_get_cookie_params() und
session_set_cookie_params().
Hinweis:
Der Verfalls-Zeitstempel wird relativ zur Serverzeit gesetzt, die nicht
unbedingt mit der Browserzeit des Clients übereinstimmt.
session.cookie_domain spezifiziert die Domain, unter
der das Session-Cookie gesetzt wird. In der Grundeinstellung überhaupt
keine, was bedeutet, dass entsprechend der Spezifikation für Cookies der
Hostname des Servers verwendet wird, der das Cookie erzeugt hat. Siehe
auch session_get_cookie_params() und
session_set_cookie_params().
session.cookie_secure spezifiziert, ob Cookies nur
über sichere Verbindungen geschickt werden sollen. Grundeinstellung
off. Diese Einstellung wurde in PHP 4.0.4
hinzugefügt. Siehe auch session_get_cookie_params()
und session_set_cookie_params().
session.cookie_httponly markiert das Cookie als nur
über das HTTP-Protokoll zugänglich. Das bedeutet, dass für
Skriptsprachen wie z.B. JavaScript nicht zugänglich ist. Diese
Einstellung kann helfen, Identitätsdiebstahl durch XSS-Angriffe zu
reduzieren (obwohl es nicht von allen Browsern unterstützt wird).
session.cache_limiter spezifiziert die Methode der
Cacheverwaltung, die bei Session-Seiten benutzt wird
(none/nocache/private/private_no_expire/public). Grundeinstellung
nocache. Siehe auch
session_cache_limiter().
session.cache_expire spezifiziert in Minuten, wie
lange Session-Seiten im Cache bleiben. Bei nocache ist diese Angabe
wirkungslos. Grundeinstellung 180. Siehe auch
session_cache_expire().
session.use_trans_sid bestimmt ob transparente
SID-Unterstützung aktiviert ist oder nicht. Grundeinstellung
0 (deaktiviert).
Hinweis:
In PHP 4.1.2 oder darunter wird sie durch compilieren mit --enable-trans-sid aktiviert. Ab PHP 4.2.0
ist das Feature trans-sid immer eincompiliert.
URL-basiertes Session-Management hat im Vergleich zu Cookie-basiertem
Session-Management zusätzliche Sicherheitsrisiken. Benutzer können zum
Beispiel eine URL, die eine aktive Session-ID enthält, per Email an
Freunde schicken oder in ihren Bookmarks speichern und immer mit der
selben Session-ID auf Ihre Seite zugreifen.
Die PHP-Versionen bis 4.2.3 haben eine undokumentierte Funktion/einen
undokumentierten Fehler, der es Ihnen gestattet, eine Session-Variable
im globalen Bereich zu initialisieren, obwohl register_globals deaktiviert ist.
Ab Version 4.3.0 gibt PHP bei Verwendung dieser Funktion eine Warnung
aus, wenn zusätzlich session.bug_compat_warn
aktiviert ist. Diese Funktion/dieser Fehler kann durch Deaktivieren
dieser Einstellung deaktiviert werden.
Die PHP-Versionen bis 4.2.3 haben eine undokumentierte Funktion/einen
undokumentierten Fehler, der es Ihnen gestattet, eine Session-Variable
im globalen Bereich zu initialisieren, obwohl register_globals deaktiviert ist.
Ab Version 4.3.0 gibt PHP bei Verwendung dieser Funktion eine Warnung
aus, wenn sowohl session.bug_compat_42 als
auch session.bug_compat_warn
aktiviert sind.
session.hash_function gibt Ihnen die Möglichkeit, den
Prüfsummen-Algorithmus für die Erzeugung von Session-IDs selbst zu
bestimmen. '0' bedeutet MD5 (128 Bit) und '1' bedeutet SHA-1 (160 Bit).
Ab PHP 6.0.0 ist es auch möglich, einen der Algorithmen zu bestimmen,
die durch die Hash-Erweiterung (falls
vorhanden) zur Verfügung stehen, wie z.B. sha512 oder
whirlpool. Eine vollständige Liste unterstützter
Algorithmen erhalten Sie mit der Funktion
hash_algos().
session.hash_bits_per_character gibt Ihnen die
Möglichkeit, zu definieren wieviele Bit bei der Umwandlung der binären
Prüfsummen-Daten in etwas Lesbares in jedem Zeichen gespeichert werden.
Mögliche Werte sind '4' (0-9, a-f), '5' (0-9, a-v) und '6' (0-9, a-z,
A-Z, "-", ",").
url_rewriter.tags bestimmt, wenn Unterstützung für
transparente SID aktiviert ist, welche HTML-Tags so umgeschrieben
werden, dass sie die Session-ID beinhalten. Grundeinstellung
a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=
Hinweis:
Wenn Sie HTML/XHTML strict-Konformität wollen, müssen Sie den
form-Eintrag entfernen und Ihre Formularfelder
zwischen <fieldset>-Tags setzen.
Die Konfigurationseinstellungen von track_vars und register_globals
beeinflussen, wie die Session-Variablen gespeichert und wiederhergestellt
werden.
Hinweis:
Seit PHP 4.0.3 ist track_vars immer
aktiviert.
Resource Typen
Diese Erweiterung definiert keine Resource-Typen.
Vordefinierte Konstanten
Folgende Konstanten werden von dieser
Erweiterung definiert und stehen nur zur Verfügung, wenn die Erweiterung entweder
statisch in PHP kompiliert oder dynamisch zur Laufzeit geladen wurde.
Konstante, die entweder den Namen und die ID der Session in der
Form "name=ID" enthält oder eine leere
Zeichenkette, falls die Session-ID in einem entsprechenden
Cookie gesetzt wurde.
Beispiele
Hinweis:
Seit PHP 4.1.0 steht $_SESSION genau wie
$_POST, $_GET,
$_REQUEST und so weiter, als globale Variable zur
Verfügung. Im Gegensatz zu $HTTP_SESSION_VARS ist
$_SESSION immer global. Deshalb brauchen Sie für
$_SESSION nicht das Schlüsselwort global zu
verwenden. Bitte beachten Sie, dass in dieser Dokumentation nun überall
$_SESSION verwendet wird. Sie können
$_SESSION durch $HTTP_SESSION_VARS
ersetzen, wenn Sie Letzteres bevorzugen. Beachten Sie auch, dass Sie Ihre
Session mit session_start() starten müssen, bevor die
Verwendung von $_SESSION zur Verfügung steht.
Für die Schlüssel des assoziativen $_SESSION-Arrays
gelten die selben Beschränkungen, wie für die Bezeichnungen von regulären
Variablen in PHP, d.h. sie dürfen nicht mit einer Zahl, sondern müssen
mit einem Buchstaben oder Unterstrich beginnen. Um weitere Deteils zu
erhalten, siehe Abschnitt Variablen.
Falls register_globals
deaktiviert ist, können nur Bestandteile des globalen assoziativen Arrays
$_SESSION als Session-Variablen registriert werden.
Wiederhergestellte Session-Variablen stehen nur im Array
$_SESSION zur Verfügung.
Aus Gründen der Verbesserung der Sicherheit und der Lesbarkeit des Codes
wird die Verwendung von $_SESSION (oder
$HTTP_SESSION_VARS bei PHP 4.0.6 oder niedriger)
empfohlen. Mit $_SESSION werden die Funktionen
session_register(),
session_unregister() und
session_is_registered() nicht benötigt. Auf die
Session-Variablen kann wie auf jede normale Variable zugegriffen werden.
Example#1
Registrierung einer Variablen mit $_SESSION.
<?php session_start(); // Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS if (!isset($_SESSION['zaehler'])) { $_SESSION['zaehler'] = 0; } else { $_SESSION['zaehler']++; } ?>
Example#2
Aufheben der Registrierung einer Variablen mit
$_SESSION und deaktiviertem register_globals.
<?php session_start(); // Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS unset($_SESSION['zaehler']); ?>
Achtung
Heben Sie NICHT die Registrierung der gesamten
$_SESSION mit unset($_SESSION)
auf, weil dies die Registrierung von Variablen durch die Superglobale
$_SESSION deaktivieren würde.
Warnung
Sie können in Session-Variablen keine Referenzen verwenden, weil es keine
praktikable Möglichkeit gibt, eine Referenz in eine andere Variable
zurückzuführen.
Wenn register_globals
aktiviert ist, kann jede globalen Variable als Session-Variable
registriert werden. Beim Neustart einer Session werden diese Variablen als
entsprechende globale Variablen wiederhergestellt. Da PHP wissen muss,
welche globalen Variablen als Session-Variablen registriert sind, muss der
Benutzer Variablen mit der Funktion session_register()
registrieren. Sie können das vermeiden, indem Sie einfach Einträge in
$_SESSION setzen.
Wenn register_globals
aktiviert ist, dann referenzieren die globalen Variablen und die Einträge
von $_SESSION automatisch die selben Werte, die in der
vorherigen Instanz der Session registriert wurden. Falls die Variable
mittels $_SESSION registriert wird, steht die globale
Variable allerdings erst ab der nächsten Anfrage zur Verfügung.
Es gibt einen Fehler in PHP 4.2.3 und früheren Versionen. Wenn Sie eine
neue Session-Variable mittels session_register()
registrieren, referenzieren der Eintrag im globalen Bereich und der
$_SESSION-Eintrag bis zum nächsten
session_start() nicht den selben Wert. D.h. eine
Änderung an der neu registrierten globalen Variablen wird nicht vom
$_SESSION-Eintrag widergespiegelt. Dies wurde in PHP
4.3.0 korrigiert.
Übermittlung der Session-ID
Es gibt zwei Methoden, eine Session-ID zu übermitteln:
Cookies
URL Parameter
Das Session-Modul unterstützt beide Methoden. Cookies sind optimal, aber
da sie nicht immer zur Verfügung stehen, bieten wir auch noch eine
Alternative an. Die zweite Methode hängt die Session-ID direkt an die
URLs.
PHP ist in der Lage, Links transparent umzuwandeln. Falls Sie nicht PHP
4.2.0 oder höher verwenden, müssen Sie das beim Übersetzen von PHP manuell
aktivieren. Unter Unix müssen Sie dazu configure mit --enable-trans-sid aufrufen.
Wenn diese Option und die Laufzeit-Option
session.use_trans_sid aktiviert sind, werden relative
URIs automatisch so geändert, dass sie die Session-ID enthalten.
Hinweis:
Die php.ini-Anweisung arg_separator.output
ermöglicht es, die Trennung von Argumenten anzupassen. Geben Sie dort
für volle XHTML-Konformität & an.
Alternativ können Sie die Konstante SID verwenden, die
definiert ist, nachdem die Session gestartet wurde. Falls der Client kein
geeignetes Session-Cookie gesendet hat, hat sie die Form
session_name=session_id. Andernfalls wird sie zu einer
leeren Zeichenkette erweitert. Aus diesem Grund können Sie sie
bedingungslos in URLs einbetten.
Das folgende Beispiel demonstriert, wie eine Variable registriert wird und
wie unter Verwendung einer SID korrekt auf eine andere Seite verwiesen
wird.
Example#3
Zählen der Seitenaufrufe eines einzelnen Benutzers
<p> Hallo Besucher, Sie haben diese Seite <?php echo $_SESSION['zaehler']; ?> Mal aufgerufen. </p>
<p> Hier gehts <A HREF="nextpage.php?<?php echo htmlspecialchars(SID); ?>">weiter</A>. </p>
Die Funktion htmlspecialchars() kann dazu verwendet
werden, um bei der Ausgabe der SID XSS-ähnliche Angriffe zu verhindern.
Die oben gezeigte Ausgabe der SID ist nicht nötig, wenn PHP mit --enable-trans-sid übersetzt
wurde.
Hinweis:
Bei nichtrelativen URLs wird davon ausgegangen, dass sie auf externe
Seiten zeigen und deshalb keine SID angehängt, weil es ein
Sicherheitsrisiko wäre, die SID an einen anderen Server zu übermitteln.
Wenn Sie die Speicherung in einer Datenbank oder irgendeine andere Art der
Speicherung realisieren wollen, können Sie
session_set_save_handler() verwenden, um eine Reihe von
benutzerdefinierten Speicherfunktionen zu erzeugen.