PHP Session-Management erklärt

Anmerkung: Dieser Post ist dem Teil über Session-Highjacking und Session-Fixation vorgeschaltet, da der Artikel darüber sonst zu lang geworden wäre.

In dem Moment, indem der Benutzer per session_start(); eine Session verpasst bekommt, wird ein Session-Cookie auf dem PC des Benutzers angelegt, der bei jedem folgenden Request wieder an den Server übertragen wird. Dieser Cookie hat den Name PHPSESSID und im Inhalt steht der Session-Name. Der sieht etwa so aus: 3cm12d11d14fg0ssklulk1k274. Dieser Session-Cookie wird verwendet, um den Benutzer wiedererkennen zu können. Mit Firebug oder dem coolen Firefox-Addon Edit Cookies (welches wir später sowieso noch brauchen) lässt sich gut sehen, welche Cookies übertragen werden und was deren Inhalt ist.

Ein Test: Auf dem localhost eine Datei mit folgendem Inhalt anlegen:

session_start();  print session_name()."=".session_id();  

und gleichzeitig Das Firebug Net-Panel aufmachen. Das Ergebnis wird ungefähr so aussehen:

session-check

session-check

So wird also klar, wie die Server-Session und der Session-Cookie auf dem PC des Benutzers zusammenhängen. Nun gebe ich der Session auch noch einen Wert mit:

session_start();  $_SESSION['test'] = "testing with values";  print session_name()."=".session_id();  

Auf der Serverseite ist nun im /tmp/-Verzeichnis (unter Windows-XAMPP bei mir D:\xampp\tmp\) in der Datei sess_[meine-session-id] folgendes gespeichert:

test|s:19:"testing with values";  

Macht Sinn, oder?

Relevante php.ini – Einstellungen für Sessions

Es gibt 4 wirklich wichtige Einstellungen für die Session-Verwaltung:

session.use_cookies  session.use_only_cookies  session.use_trans_sid  session.cookie_httponly  

  1. session.use_cookies (Defaultwert: 1) besagt, ob session-cookies angelegt werden. Unbedingt auf 1 lassen. Im Fall einer Deaktivierung dieser Option muss bei jedem Link die Session-ID wieder angehangen wird. Das ist hässlich und unsicher. Dann sieht jeder Link ungefähr so aus:
    http://www.webseite.de/user-area/edit-profile.php?PHPSESSID=3cm12d11d14fg0ssklulk1k274
  2. session.use_only_cookies (Defaultwert ab PHP 5.3: 1) beschränkt die Session-Verwaltung ausschließlich auf Session-Cookies. Es sperrt Benutzer, die Cookies deaktiviert haben komplett aus, weil es dann nicht mehr möglich ist, per ?PHPSESSID=… einen workaround für user ohne Cookies zu fahren. Trotzdem ist die Voreinstellung 1 sinnvoll, da es Angriffe um einen ganzen Zacken schwieriger macht. Achtung: Der Get-Parameter PHPSESSID ist „stärker“ als der Session-Cookie. Ist also session.use_only_cookies deaktiviert, kann man mittels Parameter seine Session-ID manipulieren, da der Parameter wichtiger als der Cookie eingestuft wird.
  3. Ist session.use_trans_sid (Defaultwert: 0) eingeschaltet, wird jedem Link auf eurer Webseite automatisch (also ohne das ihr euch selbst drum kümmern müsst) das ?PHPSESSID=… angehängt. Ist also ein „convenience“-Feature, wenn ihr session.use_cookies = 0 eingestellt habt und euch nicht selbst bei jedem Link drum kümmern wollt. Die Option sollte man also tunlichst auf 0 belassen.
  4. session.cookie_httponly (Defaultwert ab PHP 5.3 = 1) besagt, ob der Session-Cookie per Javascript mittels document.cookie ausgelesen werden darf. Problem dabei ist nur, dass es der Browser unterstützen muss. Und das war bei meinen Recherchen mit Firefox 3.6, Chrome 7, Opera 10, Safari 5 und dem IE8 noch in keinem Browser der Fall.

    Korrektur: Hatte einen Fehler in meinem Testscript. Nach einer Korrektur stellte sich heraus, dass genau das Gegenteil wahr ist: Alle getesteten Browser bis einschließlich IE6 verhalten sich absolut korrekt und geben den Cookie per Javascript nicht aus, wenn session.cookie_httponly = 1 ist.

    Demnach ist es sinnvoll, diesen Wert auf 1 zu belassen, denn erstens braucht man wohl in der Regel sinnvollerweise kaum Zugriff mit Javascript auf den Session-Cookie und zweitens erhöht es die Sicherheit gegen Session Highjacking-Attacken nochmal um ein Stückchen.

  5. Auf jeden Fall mal auf die offizielle Seite zur php.ini-Konfiguration schauen!

Fazit dieser kleinen Abhandlung

Die php.ini-Defaultwerte sind sehr vernünftig gewählt. Trotzdem sollte man nachprüfen, ob diese bei euch korrekt gesetzt sind. Session-IDs per URL zu übergeben ist in jedem Fall böse, da man so dem Benutzer die Möglichkeit gibt, seine Session-ID ganz bequem selbst zu ändern. Leider wird damit Session-Highjacking / Session-Fixation nur erschwert, nicht aber unmöglich gemacht. Mehr dazu im nächsten Teil.


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0