quakenet:#php Tutorial

Author: Jones, zuletzt bearbeitet von progman @ 2005/02/18 15:41:41

Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.

Session

  1. Sessions? Was ist das schonwieder?
  2. Start von Sessions
  3. Wo stecken die Daten?
  4. Übergeben der Session-ID
  5. Sicherheit
  6. Blockschaltbild vom Sessionsystem

1. Sessions? Was ist das schonwieder?

Oft fragt man sich, wie man einen bestimmten Benutzer auf einer Homepage Seitenübergreifend identifizieren kann. Nun, das Zauberwort heißt Sessions.

Daten sind normalerweise nur fuer die Laufzeit des Scriptes verfügbar. Nach einem Seitenaufbau sind alle Daten (Variablen) vergessen. Um trotzdem Daten an die nachfolgende Scripte zu uebergeben, hat man bisher entweder ein Formular mit Werten gefüllt oder an den URL die Variablen angehängt:

<form ...>
    <input name="variable" value="wert" ... />
</form>

oder

<a href="script.php?variable=wert">link</a>

Damit kann man aber noch nicht die Benutzer unterscheiden. Das Unterscheiden wird mit Sessions gemacht, in dem man statt den ganzen Variablen nur eine einzige Variable mitschickt: die Session-ID. Diese Session-ID ist ein eindeutiger Wert für einen Nutzer, damit PHP auf gespeicherte Daten in anderen Scripten zugreifen kann.

2. Start von Sessions

Um eine Session-ID zu bekommen, muß man eine Session anlegen. Dies geschieht mit der Funktion session_start. Es ist darauf zu achten, dass die Session nach Möglichkeit vor allem anderen gestartet wird, damit alle Teile des Scriptes darauf zugreifen können (auch etwaige Includes).

<?php //Dateistart
    
session_start();
    include
"....";
?>

Da PHP selbstständig überprüft, ob eine Session schon existiert, oder ob eine neue angelegt werden muß, braucht man sich auch nicht darum zu kümmern.

3. Wo stecken die Daten?

Um nun Daten für einen bestimmten Nutzer aufzuheben, muss man sie registrieren. Das macht man einfach, in dem man mit dem Feld $_SESSION arbeitet, wie mit einem gewöhnlichen Array. Beispielsweise:

<?php
    $_SESSION
["username"] = "hans wurst";   // speichert in der session ab
    
$_SESSION["lottozahlen"] = array(9,13,20,30,41,45);
    
// speichert das array in der session

    
foreach($_SESSION["lottozahlen"] as $zahl) {
            echo
$zahl." ";
    }

    
// variable testen ob sie vorhanden ist, und ggf loeschen...
    
if(isset($_SESSION["lottozahlen"])) {
        unset(
$_SESSION["lottozahlen"]);
    }

?>

Wie man mit einem solchen Arrays umgeht, sollte man an diesem Punkt des Tutorials schon wissen, oder sich noch einmal im Abschnitt Array informieren.

4. Übergeben der Session-ID

Damit man nun an die Session-Daten dran kommt muss man an das Script, welches die Session-Daten wieder auslesen soll, die SessionID mitliefern. Dies kann natürlich die selbe Datei sein, wenn man immer eine index.php aufruft. Dabei gibt es 3 Möglichkeiten, wie man die Session-ID übergibt ( "bd35eeb6782692456ada4e67bde53bde" ist hier eine Beispiel Session-ID).

  1. GET - Die einfachste Möglichkeit ist es, die Session-ID über die URL mitzugeben. Die URL könnte dann so aussehen.

    index.php?section=news&PHPSESSID=bd35eeb6782692456ada4e67bde53bde
                    
  2. POST - Wenn man ein Formular verarbeiten möchte, wobei das Script auf Session-Daten zurückgreife muss, gibt es 2 Möglichkeiten, wie man die Session-ID übergibt.

    1. In dem action-Attribut des form-Elements kann man das Ziel-Script angeben. Dort kann man auch die Session-ID anfügen. Dies entspricht dann wieder der GET Methode, obwohl das Script über POST gesendet wird.

      <form action="index.php?PHPSESSID=bd35eeb6782692456ada4e67bde53bde" method="post">
          ...
      </form>
                              
    2. Im Formular fügt man ein hidden-input-Feld ein. Somit wird die Session-ID als pseudo-Formular-Eingabe gesendet.

      <form action="index.php" method="post">
          ...
          <input type="hidden" name="PHPSESSID" value="bd35eeb6782692456ada4e67bde53bde" />
      </form>
                              
  3. COOKIE - Das PHP Script kann auch die Session-ID in einen Cookie beim Client speichern lassen. Der Browser sendet dann immer die Session-ID bei jedem aufruf.

PHP ist meistens, nicht immer, so konfiguriert, dass die Funktion session_start ein Cookie zum Client/Browser schickt, damit er die Session-ID speichern kann. PHP sorgt auch dafür dass nach Links automatisch die Session-ID angehängt wird.

Wenn PHP dies nicht macht, oder sie dies nicht möchten, müssen sie die Session-ID manuell übergeben. Dabei braucht sie 2 Funktionen.

  1. session_name - Mit dieser Funktion können sie den Parameternamen des Session-Systems verändern oder auslesen. Standardmäßig ist dieser PHPSESSID.

  2. session_id - Diese Funktion liefert die eigentliche Sesson-ID zurück.

Mit den beiden Funktionen können sie nun die Session-ID an das folgende Script übergeben.

<?php
    
echo "<a href=\"index.php?".session_name()."=".session_id()."\">test</a>\n";

    echo
"<input type=\"hidden\" name=\"".session_name()."\" value=\"".session_id()."\" />\n";


    
setcookie(session_name(), session_id(), time()+3600);
?>

Mit der Funktion ini_set können sie die php.ini-Konfiguration für das aktuelle Script umstellen. Somit können sie z.B. session.use_cookies ausschalten, falls sie keine Cookies benutzen wollen. Im PHP-Manual session sehen sie, welche Konfigurationsvariablen sie verändern können.

Anstatt die Session-ID mit session_name und session_id zu übergeben gibt es bei Sessions eine Konstante SID. Sie enthält beim starten der Session den String sessionname=sessionid, eignet sich also hervorragend um mit & an die URL angehängt zu werden. Wird die Session-ID mit Cookies übergeben sorgt session_start() dafür dass die Konstante leer ist. Man braucht die Session-ID ja nur einmal übergeben, nicht doppelt mit Cookies und mit der URL.

5. Sicherheit

Noch ein kurzer Satz zur Sicherheit von Sessions. Sessions sind keineswegs sicher. Zumindest nicht so, wie sie in PHP implementiert sind. Da man hier einfach durch Weitergabe der Session-ID die Session übernehmen. D.h. ein anderer Benutzer könnte, in dem er z.B. die URL samt Session-ID im IRC gepastet bekommt, diese Session übernehmen und auch die Daten des eigentlichen Besitzers einsehen. Um solche Effekte zu vermeiden sind zum einen Cookies nicht schlecht, da hier keine Session-ID in der URL mitgegeben werden muß. Allerdings sind Cookies auch kein Standard, und man würde jeden ausschliessen, der Cookies verweigert.

Eine Möglichkeit Sessions sicherer zu machen, ist es die IP des Nutzers zu speichern. Dies ist allerdings auch kein Allheilmittel, da man hier teilweise auch nur die Proxy-IP bekommt usw.

Wer etwas größeres mit Sessions plant sollte sich auf jedenfall noch den Session Abschnitt aus dem PHP-Manual zu Gemüte führen.

6. Blockschaltbild vom Sessionsystem

Nun erklär ich mal grob, wie Sessions geladen werden. Dabei starten wir mit dem Dateianfang.

Start der Datei
Abb.: Start der Datei

Bevor man eine Session benutzen kann, darf man keine Ausgabe jeglicher Art erzeugen.

Nur Programmteile, die keine Ausgabe erzeugen
Abb.: Nur Programmteile, die keine Ausgabe erzeugen

Nun können wir die Session starten.

Aufruf von session_start()
Abb.: Aufruf von session_start()

Mit session_start wird nun die Session geladen.

Wie wird eine neue/existierende Session geladen
Abb.: Wie wird eine neue/existierende Session geladen

Je nach dem, ob die Session-ID vorhanden ist und es auch eine entsprechende Session mit dieser ID gibt, wird diese Session geladen oder es wird eine neue leere Session erstellt. Im Programm ist dann das Array $_SESSION vorhanden.

Benutzen und abspeichern der Session
Abb.: Benutzen und abspeichern der Session

Nachdem man mit der Session gearbeitet hat und das Ende der Datei erreicht wurde, speichert PHP automatisch die Session-Daten ab.

Dies ist eine extreme Vereinfachung wie Sessions funktionieren. Dass dabei das Array mit serialize bearbeitet wird und dann mit fopen und co abgespeichert wird, brauchen wir nicht zu wissen. Wir rufen einfach session_start auf und benutzen das Array $_SESSION.

Fragen zum aktuellen Thema

  1. Muss ich die SessionID immer 'per Hand' mitliefern?
Muss ich die SessionID immer 'per Hand' mitliefern?

Wenn PHP auf mit transparenten Session-ID's kompiliert worden ist, dann braucht man die Sesseion-ID nicht extra anzugeben, weil dann der Server an jeden URL automatisch selbige anhängt.

Nach oben