Sven Rautenberg: session.cookie_lifetime funktioniert nicht wie es soll

Beitrag lesen

Moin!

Wenn du das nicht prüfst, reicht es ja aus, PHP einfach die Session-ID als Cookie oder in der URL zu senden, und die Session geht weiter. Denn die Session-Daten werden nicht sofort bei Ablauf der Session gelöscht, sondern nach einem Zufallsprinzip bei (einstellbar) 1 bis 100% aller Zugriffe. Es werden deine alten Session-Daten also noch verfügbar sein - und PHP macht einfach dort weiter, wo die "alte" Session (eigentlich ja nicht wirklich) aufgehört hat.

Du meinst die Sessiondaten werden nicht laut der gc_maxlifetime zerstört sondern zufällig? Welchen Sinn hat dann eigentlich diese Einstellung ?

Sie steht in Verbindung mit der session.gc_probability. Die Garbage Collection (dafür steht gc) ist eine aufwendige Sache. Sie betrifft _alle_ auf dem Server vorhandenen Sessions. Und die Maxlifetime einer Session (bzw. das Überschreiten derselben) wird von PHP anhand der letzten Zugriffszeit auf die jeweilige Session-Datei festgestellt. Wenn das Dateisystem diese "atime" (identisch mit der Zeit, die fileatime() liefert) aber gar nicht speichert (Windows kann das wohl mit keinem der Dateisysteme, und unter Unix-Dateisystemen kann man diese Performancebremse abschalten), dann klappt der Mechanismus der PHP-Standardaufräumung nicht mehr so ganz. Offenbar jedenfalls.

PHP selbst kann ja ohnehin nur aktiv werden, wenn ein PHP-Skript aufgerufen wird. Deshalb diese Wahrscheinlichkeitsgeschichte. Weil die Garbage Collection von abgelaufenen Session-Dateien so aufwendig ist (die atime jeder Session-Datei muß geprüft und ggf. die Datei gelöscht werden), ist es ziemlicher Wahnsinn, dass bei jedem Scriptaufruf zu erledigen. Sowas lohnt sich eben nicht. Und es ist für viele Anwendungen auch gar nicht so schlimm, wenn die Session nicht sofort bzw. nach dem Zeitablauf gelöscht wird - es hängt viel von den Daten ab, die in der Session gesammelt werden.

Außerdem ist das Übernehmen einer Session durch einen anderen Surfer sehr unwahrscheinlich. Deshalb ist es in der Regel ohnehin auch vom Sicherheitsstandpunkt aus irrelevant, ob die Sessiondaten _exakt_ nach Ablauf der gc_maxlifetime gelöscht werden, oder irgendwann danach. Ein böser Angreifer, der die Sessiondaten geraten hat (wie gesagt: extrem unwahrscheinlich, wenn er keinen Anhaltspunkt hat), wird im Zweifel (wenn's dumm läuft) sowieso vorher die Session übernommen haben, so dass sie gar nicht erst endet.

- Sven Rautenberg

--
ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|