Sessions Teil 4 - Fallstricke

  • Leider hat auch die Verwendung von Sitzungen unter PHP ihre Fallstricke und Stolpersteine. Im letzten Teil der kleinen Reihe gibt's daher ein paar Tipps und Erläuterungen gegen möglichen Frust beim Programmieren mit Sessions. Eine gestartete Sitzung funktioniert nur solange, wie auch die Session-ID von einer Seite auf die nächste Seite übertragen wird. Hier gibt es mehrere Möglichkeiten: Beim Starten der Session wird versucht, ein Cookie beim Clienten anzulegen. Dieses enthält genauso lange die Session-ID, wie die Sitzung aktiv ist. Grundlegend ist dies ein feine Sache, leider deaktivieren einige Benutzer die Verwendung von Cookies, und dann kommt es im Bezug auf noch folgende Probleme zu weiteren Ungereimtheiten. Ich verwende daher stets die Anweisung ini_set('session.use_cookies', '0'); vor dem Start einer Session. Damit unterbinden Sie generell die Nutzung von Cookies für diese eine Session. Wenn keine Cookies verwendet werden, muss etwas anderes zur Übertragung der Session-ID her: Kompliziert ist die Möglichkeit, die Sitzungsnummer in die Adresse einzubauen. Dies lässt sich beispielsweise bei Amazon.de beobachten. Die Adresse trägt immer etwas Zahlenwust am Ende in sich. Die gebräuchlichste Möglichkeit ist jedoch, die Session-ID per GET hinten an die Adresse anzuhängen, also wie es die Beispiele aus Teil 2 und Teil 3 zeigen. Dies lässt sich daran erkennen, dass am Ende der Adresse ein Fragezeichen mit nachfolgender Kennnummer zu lesen ist. Hier ergibt sich jedoch ein Problem: Jedem Link innerhalb einer Sitzung muss diese Kennnummer angehängt bzw. jedem Formular ein entsprechendes verstecktes Input-Feld eingefügt werden. Und je nach Konfiguration von PHP geschieht dies automatisch oder eben auch nicht. Überprüfen lässt sich dies ganz einfach. Ein PHP-Skript mit <?php phpinfo(); ?> erstellen und aufrufen. Die Option trans-sid gibt an, ob die Kennnummer automatisch hinzugefügt wird (On bzw. 1) oder nicht (Off bzw. 0). Sollten Ihre Sitzungsseiten also nicht funktionieren, liegt es eventuell an einer nicht übermittelten Sitzungsnummer. trans-sid ist in dieser Hinsicht relativ praktisch, aber auch nicht perfekt und leider rechenintensiv. Bei einigen PHP-Skripten wird die Kennnummer an der falschen Stelle, etwa vor der Adresse eingefügt und nicht korrekterweise danach. Ältere Versionen von PHP fügen bei aktiviertem trans-sid keinen XHTML-validen Code ein. Die Seite wird von den meisten Browsern dann zwar immer noch akzeptiert, aber perfekt ist die ganze Sache leider nicht. Außerdem lässt sich die Kennnummer klauen: Rufen Sie die Seite mit der gleichen Sitzungsnummer auf einem anderen Computer auf, sind Sie plötzlich auch mit diesem Computer in der gleichen Sitzung drin. Dagegen sollen zeitlich begrenzte Sessions helfen. Unter PHP verfallen die (ungenutzten) Sitzungen je nach Konfiguration nach etwa 20 Minuten. Im dritten Teil habe ich im Beispiel einen zusätzlichen Schutz eingebaut: Bestandteil der Session-Daten ist hier die IP-Nummer gewesen. Wenn die Benutzer-IP plötzlich nicht mehr mit der IP vom Session-Start übereinstimmt, dann wird der potenzielle Session-Klauer der Zugang verwehrt. Ich denke, wenn Sie an obige Punkte beim Programmieren mit Sessions denken, dann sollte nicht all zu viel schief gehen und Maus sowie Tastatur müssen aus Ärger nicht unnötig malträtiert werden. Viel Erfolg.