de.comp.lang.php.* FAQ

29.1. Wie realisiere ich Sessions mit PHP?

Antwort von Daniel T. Gorski

Sessiondaten sind Daten, die z.B. von einem PHP-Script auf dem Server gespeichert werden, und die meistens für die Dauer des Besuchs (Session/Sitzung) auf mehreren Pages einer Website ihre Gültigkeit behalten. Sessiondaten können z.B. dazu benutzt werden, um dem Besucher restriktiven Zugriff (z.B. nach einem Login) auf Teile einer Website zu erlauben - üblicherweise zu einem Administrationsbereich.

In der PHP4-Standardeinstellung werden diese Daten als ASCII- Dateien im /tmp-Verzeichnis (session.save_path) des Servers gespeichert. Diese Dateien enthalten das serialsierte ( serialize() ) Abbild der von einem Script gespeicherten Variablen. Der Name dieser Dateien setzt sich aus dem Prefix sess_ und einer 32-Zeichen langen, zufällig ausgewählten Zeichenkette (der Session-ID) zusammen.

Die Manipulation dieser Daten bleibt nur dem serverseitig ausgeführtem PHP-Script vorbehalten - der Client (Browser) weiß nicht welche Daten von dem Script gespeichert werden und er kann keinen mittelbaren Einfluss auf diese Daten nehmen. Ausnahme bildet hier die Änderung/Löschung dieser Daten durch den Administrator oder durch ein Script mit entsprechenden Rechten (siehe auch Wie schütze ich Sessiondaten zusätzlich?).

Unter diesen Voraussetzungen gelten die Sessiondaten bei einem korrekt installierten Webserver, als sicher und durch den Besucher nicht fakebar.

PHP4 stellt mehrere Funktionen zu Sessionverwaltung zu Verfügung (siehe auch die Sessionsreferenz , die grundlegenden seien hier kurz vorgestellt:

Bei Verwendung dieser Funktionen ist zu beachten, dass eine neue Session nur dann angelegt werden kann, wenn noch keine Ausgabe stattgefunden hat. Mehr Informationen dazu finden sich im Artikel Warning: Cannot send session cookie - headers already sent ....

session_start()

Session(datei) auf dem Server erstellen. Wurde eine gültige Session-ID übergeben, werden die in den Sessiondaten gespeicherten Werte in dem $_SESSION-Hash wiederhergestellt und abhängig von der Einstellung der register_globals auch als Variablen reinitialisiert.

Zusätzlich werden, je nach Einstellung des session.gc_probability -Parameters, in diesem Augenblick die angehäuften und nicht mehr benötigten Sessiondateien vom Server gelöscht. Wenn das error_reporting() schärfer eingestellt ist, gibt session_start() eine entsprechende Notice aus. Da diese üblicherweise nicht erwünscht ist, empfiehlt es sich vor die session_start() -Funktion ein "@" zu schreiben, welches diese Warnung unterdrückt.

Also:

<?php
    @session_start();
?>

Das $_SESSION-Hash

Der Zugriff auf Sessionvariablen erfolgt seit PHP 4.1.0 über das assoziative Array $_SESSION. Durch das erste Ansprechen eines Arrayelements wird die Sessionvariable angelegt, durch ein unset() kann eine Variable gelöscht werden. Bis PHP 4.0.6 hieß das entsprechende Array $HTTP_SESSION_VARS. Wenn register_globals aktiviert ist, müssen bei PHP Versionen, die älter als PHP 4.3 sind, die Sessionvariablen mit session_unregister() aus der Session entfernt werden.

session_destroy()

Die Funktion session_destroy() veranlasst alle Variablen einer Session zu verwerfen und die Session(datei) löschen.

Ein genauerer Einblick in die Funktionsweise dieser Funktionen wird hier gewährt: Was geschieht im Filesystem des Servers, wenn ich Sessions benutze?.

Beispiel 1

Beispiel 1: seite1.php

<?php
    // Falls nicht vorhanden, generiert eine Session(datei)
    // auf dem Server.
    // Falls bereits vorhanden, liest Sessiondaten wieder ein und
    // (re-)initialisiert die gespeicherten Variablen.

    @session_start();

    // Erst wenn das Script terminiert(!), merkt PHP den Inhalt
    // der Variablen $s_userName und $s_userPermissions in
    // den Sessiondaten.

    $_SESSION['userName']        =   "dtg";
    $_SESSION['userPermissions'] =   "keine :=(";
?>

Beispiel 1: seite2.php

<?php
    // Falls nicht vorhanden, generiert eine Session(datei)
    // auf dem Server.
    // Falls bereits vorhanden, liest Sessiondaten wieder ein und
    // (re-)initialisiert die gespeicherten Variablen.

    @session_start();

    // Gibt den Inhalt der wiederhergestellten Variablen aus.
    echo "<P>Hallo " . $_SESSION['userName'] . ",";
    echo "<P>Du hast " . $_SESSION['userPermissions'] . " Zugriffsrechte.";

    // Wird in diesem Script kein unset() oder
    // session_destroy() ausgeführt, bleiben die Daten erhalten!
?>

Damit das Folgescript (seite2.php) weiß, in welcher Datei auf dem Server die benötigten Daten zu finden sind, muss ihm die sog. Session-ID übergeben werden. Diese Session-ID repräsentiert den eindeutigen Namen der Session (es ist der bereits erwähnte 32-Zeichen lange String).

Um die Session-ID an eine andere Seite zu übergeben, benutzt PHP4 in der Standardeinstellung Session-Cookies, welche nicht gespeichert werden und mit dem Schließen des Browsers verfallen. In diesen Cookies wird der Name der Session (z.B. PHPSESSID) und die zugehörige Session-ID abgelegt. Bei einem Request auf ein Folgescript wird der Cookieinhalt mitgeschickt, und PHP weiß damit in welcher Sessiondatei die benötigten Daten gespeichert sind.

Dies passiert automatisch, ohne dass zusätzlicher Code geschrieben werden muss.

Beispiel 2

Hat man z.B. eine komplizierte Suchmaske z.B für eine Datenbank, aus der man eine noch kompliziertere Query basteln muss, über deren Ergebnisse man auf Folgeseiten browsen will, kann es sich lohnen die Grund-Query einmalig zu generieren, und sie dann weiter an das Ausgabe-/Browse-Script zu übergeben, anstatt alle Eckparameter immerwieder zu übergeben und die Query jedesmal neu zu generieren.

Dies darf natürlich nicht über die GET- oder POST-Methode geschehen, denn der User könnte durch die Manipulation dieser Parameter ohne Probleme "böse" Queries an die Datenbank schicken. Ein Datenverlust ist dann vorprogrammiert.

Für diesen Einsatzzweck eignen sich Sessions auch, denn die dynamisch erzeugte Query wird außerhalb der Reichweite des Users auf dem Server gespeichert.

Beispiel 2: seite3.php (Formularseite)

<?php
    @session_start();

    if (isset($_POST['submit']))
        {
            // Hier prüfen, ob _alle_ benötigten Variablen,
            // die an dieses Script übermittelt wurden,
            // legal sind!
            // Hier nur fortfahren, wenn alles in Ordnung ist

            // Die Query wird anhand der Variablen,
            // die submitted wurden, erzeugt
            $_SESSION['meineTolleQuery'] = "SELECT ...";

            // HTTP-Redirect zu der Ausgabeseite
            header("Location: http://" . $_SERVER['SERVER_NAME']
                                       . "/seite4.php");
            exit;
        }
?>

    <FORM action="<?php=$_SERVER['PHP_SELF']?>" method="post">
        <!--
            Hier ganz viele Radiobuttons, Checkboxen und Inputfelder
        -->
       <INPUT type="submit" name="submit">
    </FORM>

Beispiel 2: seite4.php (Ausgabeseite)

<?php
    @session_start();

    echo "<P>Diese Query wurde mir übermittelt: "
             . $_SESSION['meineTolleQuery'];
    echo "<P>und jetzt mache ich was draus!";
?>

Valid HTML 4.01! Valid CSS!

29.1. Wie realisiere ich Sessions mit PHP?
http://www.php-faq.de/q/q-sessions-wie.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team