Hello,
Eine frage hab ich aber noch: warum darf (ausser ich) wissen wann eine SID verfällt? Was könnte das für risiken haben?
Ganz so ist das ja nun auch nicht.
Eine Session-ID hat üblicherweise eine begrenzte Länge. Auch wenn diese Länge 32 Stellen hexazezimal beträgt, möchte man dort keine Dinge einbauen, die nachvollziehbar sind, da diese den möglichen Schlüsselvorrat verringern würden. Also solllte die SID selbst nicht abhängig von der Zeit oder anderen Daten generiert werden. Sie ist einfach ein langer Schlüssel, der möglichst auch noch Unique sein sollte. In dieser Forderung steckt schon genügend Einschränkung.
Wenn der Server (Hier PHP) einen Cookie für die Session generiert, sendet er dem Client schon mit, wie lange dieser Cookie maximal gültig ist. Bei "Session-Cookies" (die nennen wir mal so) ist der Cookie solange gültig, bis die Fenster-Instanz am Browser geschlossen wird.
Auf dem Server läuft ein anderer Mechanismus. Im einfachsten Fall kümmert sich bei PHP der Garbage Collector (GC) um die Session. Die Session verfügt über eine Datei mit ihrer SID (meistens "SESS_$sid"). Diese Datei hat einen Zeitstempel, wann sie das letzte Mal angefasst wurde (A-Time), der nur vorhanden ist, wenn das Dateisystem das auch unterstützt (wird oft aus Faulheit oder Ersparnis nicht passend gemounted). Wenn diese Datei die _Mindestzeit_ von session.max_lifetime (siehe php.ini) nicht mehr angefasst wurde, dann darf sie vom GC gelöscht werden. Spätestens dann kann die Session nicht wieder aufgenommen (fortgesetzt) werden.
Eine Session besteht ja aus vielen einzelnen Requests, die sich untereinander nicht kennen. Sie erhalten einen Status (Zustand) nur durch die Sessiondaten und daa Programm (Script).
Da die Steuerung über den GC relativ schmuddelig ist, sollte die Sessiongültigkeit immer über das Anmelde- und rechteverfahren und z.B. die Datenbank gesteuert werden. Solange in der Datenbank ein gültiger Eintrag für die Session-ID vorhanden ist, sit die Session auch gültig. Die session.max_lifetime sollte so lang eingestellt werden, dass die in der Software einstellbare und in der Datenbank abgelegte Zeit auf jeden Fall kleiner ist, als die Lebensdauer der Session-Datei.
In einigen Installationen von PHP (z.B. auf Debian) wird das Aufräumen auch nicht mehr durch einen zufälligen PHP-Prozess vorgenommen, sondern durch einen Task, der sich als Cron-Job beim Cron-Daemon anmeldet, wenn das System hochfährt. Da wird die Lebensdauer der Datei dann wesentlich genauer eingehalten.
Es gibt auch Systeme, die für jeden User einen eigenen Session-Namen führen. Das hat den Vorteil, dass Manipulationen mit der Session-ID erkannt werden können.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg