Sessions

Das HTTP-Protokoll, über welches Webseiten ausgeliefert werden, ist ein zustandsloses Protokoll. Das bedeutet, dass nachdem die Seite komplett übertragen worden ist, die Verbindung abgebaut wird und der Webserver vollständig vergisst, dass er die Seite übertragen hat und noch wichtiger, an welchen Client er sie übertragen hat. Bei einem neuen Aufbau einer Verbindung zu einer anderen Seite der Website, kann er keine Verknüpfungen zu den Eingaben, welche auf der Seite davor gemacht worden sind, herstellen. Somit gehen Informationen, die dem Server vom Nutzer der Webseite mitgeteilt worden sind, verloren. Allerdings bietet PHP und ähnliche Sprachen ein Konzept der Sessions an. PHP wird serverseitig angewiesen, eine Session-ID zu erzeugen. Serverseitig werden hinter dieser Session-ID beliebige Informationen abgelegt. Die Session-ID wird dann vom Server zum Client hin übertragen. Startet der Client eine neue Anfrage an den Server, so muss er die Session-ID wieder zurück zum Server übertragen. Informationen, die über diesen einen Benutzer auf dem Server abgelegt wurden, werden vom Session-Support wiederhergestellt, so dass das PHP-Skript auf diese zugreifen kann. Somit gehen die eingegebenen Informationen des Webseitenbenutzers, die dieser schon einmal übermittelt hat, wie beispielsweise sein Benutzerlogin oder der Inhalt des Warenkorbes bei einem Wechsel zwischen den einzelnen Seiten einer Website nicht verloren.

Die ID kann auf zwei verschiedene Arten zum Client hin übermittelt werden und dort hinterlegt werden:

  • Die ID kann zum einen ein Teil der URL werden bzw. als GET-Parameter mit übermittelt werden. Problem bei dieser Übermittlung ist, dass eine solche URL in zahlreichen Logdateien mitprotokolliert wird und damit einsehbar ist. Weiterhin liefern Webbrowser standardmäßig ein Feld an eine Webseite mit, welches die URL der Seite beinhaltet, von welcher der Nutzer die Seite aufgerufen hat. Dies ist für eine Statistik sinnvoll, allerdings sicherheitstechnisch eine schwere Lücke, da in dieser URL auch die Session-ID eingebettet sein könnte. Gelangt ein Angreifer an eine Session-ID, so kann dieser die Session übernehmen und damit alle Aktionen ausführen, die der rechtmäßige Nutzer auch ausführen kann.
  • Zum anderen kann die ID auch in ein Cookie hinterlegt werden. Mit der Standardkonfiguration von PHP ist dieses Cookie vor Übernahme durch Fremde geschützt. Weiterhin brauch sich der Entwickler der PHP-Applikation auf Clientseite um die Session-ID nicht zu kümmern. Das HTTP-Protokoll sorgt selbst dafür, dass die Session-ID über ein Cookie immer mit übergeben wird. Der Entwickler kann das Session-Feature ohne viel darüber nachdenken zu müssen auf der Serverseite einfach nutzen.

PHP verfügt über zwei Möglichkeiten Sessions zu starten. PHP lässt sich in der php.ini-Datei konfigurieren, dass Sessions immer automatisch gestartet werden. Dies geschieht dort über die Variable session.auto_start, die aber standardmäßig auf ,,aus“ steht. Die andere Möglichkeit ist, die Funktion session_start() aufzurufen. Die Funktion setzt eine Session fort, wenn eine Session schon vorhanden ist. Ansonsten wird eine neue Session erzeugt, indem eine neue Session-ID generiert wird. Der Aufruf geschieht wie folgt:

Möchte man die Session-ID selbst auf Client-Seite verwalten, indem man nicht die Übergabe per Cookie nutzt, sondern über Parameter in HTML-Formularen und URLs, so lässt sich folgendermaßen ein Link mit integrierter Session-ID manuell erzeugen:

Möchte man auf die manuelle Übergabe von Session-IDs verzichten, so kann mit Hilfe der INI-Variablen session.use_only_cookies die Nutzung von Cookies erzwungen werden.

Nachdem Sessions erzeugt worden sind, sollen nun Informationen in diesen abgelegt werden. Ist eine Session geöffnet, so existiert die superglobale Variable $_SESSION. In diese kann nun wie bei einem Array Information abgelegt werden, die die aktuelle Anfrage überdauert, das bedeutet beim nächsten Request wieder verfügbar ist:

Es ist auch möglich, ganze Objekte in Sessionvariablen unterzubringen. Dies gilt jedoch nicht für Ressourcen. Wenn Objekte untergebracht werden, müssen diese Objekte serialisierbar sein. Bei der Deserialisierung muss PHP bekannt sein, welche Klasse zu diesen Objekten gehören. Deshalb muss in der INI-Variablen auto_prepend_file ein Include dieser Klassen vorhanden sein. Die INI-Variable arbeitet so, dass diese Datei automatisch vor jedes PHP-Skript gestellt wird.

Ist es nötigt, Session-Variablen wieder zu entfernen, so ist unset($_SESSION[varname]) zu verwenden.

Einige Requests später lässt sich diese Variable wieder auslesen:

Beendet ein Nutzer die Interaktion mit der Webseite, wenn er sich zum Beispiel ausloggt, so ist es ratsam die Daten der Session zu entfernen. Ein Nebeneffekt ist es auch, dass die Session-Daten auch keinen Speicherplatz mehr belegen. Eine Session kann mit session_destroy() entfernt werden.

In gewissen Fällen macht es Sinn, eine Session-ID neu zu erzeugen. Dabei wird die aktuelle Session in eine neue Session überführt. Dies macht beispielsweise dann Sinn, wenn die Session-ID versehentlich an eine externe Stelle übertragen worden ist. Mit Hilfe von session_regenerate_id(true) wird dies durchgeführt. Wird der Parameter true nicht übergeben, so wird bei einem Neugenerieren der Session-ID die alte Session-ID mit den alten Informationen nicht gelöscht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert