Daniel: session.cookie_lifetime funktioniert nicht wie es soll

Hallo!

Ich möchte gerne meinen Login Bereich so gestalten, dass die Session nach einer gewissen inaktiven Zeit aufgelöst wird. Ich habe das in der php.ini testweise einmal so eingetragen:

ini_set("session.cookie_lifetime","5");

Normalerweise sollte die Session jetz nach 5 Sekunden Inaktivität beendet werden, tut sie aber nicht. Mit phpinfo() kann ich aber sehen, dass die Einstellung vorgenommen wurde.

Muss ich da vielleicht noch was anderes einstellen?

mfg,
Daniel

  1. Moin!

    Ich möchte gerne meinen Login Bereich so gestalten, dass die Session nach einer gewissen inaktiven Zeit aufgelöst wird. Ich habe das in der php.ini testweise einmal so eingetragen:

    ini_set("session.cookie_lifetime","5");

    Es stehen interessante Kommentare zu den Session-Lebensdauern in folgenden Seiten:

    http://de.php.net/manual/de/function.session-get-cookie-params.php
    http://de.php.net/manual/de/function.session-set-cookie-params.php
    http://de.php.net/manual/de/function.session-destroy.php

    Quintessenz: Du kannst dich schlicht nicht darauf verlassen, dass die Session von PHP von allein beendet wird, sondern solltest eine eigene Zeitrechnung aufmachen. Also bei jedem Sessionzugriff einen Zeitstempel auf die aktuelle Zeit (time()) setzen,, wenn die aktuelle Zeit nicht schon mehr als X Minuten später ist, als der aktuelle Zeitstempel in der Session.

    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.

    - Sven Rautenberg

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

      Quintessenz: Du kannst dich schlicht nicht darauf verlassen, dass die Session von PHP von allein beendet wird, sondern solltest eine eigene Zeitrechnung aufmachen. Also bei jedem Sessionzugriff einen Zeitstempel auf die aktuelle Zeit (time()) setzen,, wenn die aktuelle Zeit nicht schon mehr als X Minuten später ist, als der aktuelle Zeitstempel in der Session.

      Das ist eine gute Idee, ich mache einfach eine Funktion, die manuell die Loginzeit mit der aktuellen Zugriffszeit vergleicht, hätte ich eigentlich auch selber draufkommen sollen :)

      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 ?

      Danke für die Antwort,
      Grüsse, Daniel

      1. 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:|
        1. Hallo Sven

          Danke für die aufschlussreiche Antwort!

          Grüsse,
          Daniel