Dengue: Session läuft in unregelmäßigen Zeitabständen ab

Also ich habe ein Projekt auf funpic.de laufen und ein Problem mit Sessions.

Wenn ich mich einlogge, wird der Username in einer Session gespeichert. Weiterhin wird noch ein Status in der Session gespeichert, mit dem überprüft wird, ob ich eingeloggt bin.

Ich übergebe keine Session-ID, da von funpic automatisch ein Cookie auf meinem Rechner mit der entsprechenden Session-ID abgelegt wird.

Trotzdem ist es jetzt so, dass ich mal nur nach wenigen Minuten, aber auch mal erst nach 30 Min. oder später ausgeloggt werde. Die Abstände sind total unregelmäßig. Der Logout erfolgt noch vor Ablauf des Cookies.

Das Problem tritt im IE und im FF bei jedem Rechner auf und ich habe es schon seit mehreren Monaten, habe mich aber nicht weiter darum gekümmert.

Das Login-Script basiert übrigens auf diesem Beispiel:
http://aktuell.de.selfhtml.org/artikel/php/loginsystem/

Habt Ihr eine Ahnung, was die Ursache sein könnte für das Problem?

Danke

MfG
Dengue

  1. echo $begrüßung;

    Trotzdem ist es jetzt so, dass ich mal nur nach wenigen Minuten, aber auch mal erst nach 30 Min. oder später ausgeloggt werde. Die Abstände sind total unregelmäßig. Der Logout erfolgt noch vor Ablauf des Cookies.

    Schau dir bitte die konfigurierten Werte für Sessions an (phpinfo()). Sessions haben eine konfigurierbare garantierte Mindestlaufzeit. Es gibt aber einen Zufallsmechanismus, der das Aufräumen nicht ständig bei jedem session_start()-Aufruf durchführt, so dass durchaus eine Session deutlich länger leben kann. Außerdem kann es sein, dass Server-Mitbenutzer für sich die Session-Konfigurationswerte verbiegen. Diese wirken sich dann auch auf andere Server-Mitbenutzer aus, wenn sich diese den selben session.safe_path teilen.

    echo "$verabschiedung $name";

    1. Erstmal danke für die ausführlichen Antworten.

      Würde es denn gehen, wenn ich für mich selber einen Session-Ordner anlege, in dem die Sessions gespeichert werden? Der müsste natürlich geschützt werden, damit man nicht an die Sessions herankommt.

      Ich müsste dann in jeder Datei, in der ich Sessions nutze vor dem session_start(); den Befehl session_save_path(<Pfad>); angeben, oder?

      MfG
      Dengue

      1. echo $begrüßung;

        Würde es denn gehen, wenn ich für mich selber einen Session-Ordner anlege, in dem die Sessions gespeichert werden?

        Wenn die Ursache in einem gemeinsam genutzten session.save_path liegt, dann hilft es sicher, einen eigenen Pfad zu verwenden. Einen eigenen Pfad zu verwenden ist aber auch ansonsten empfehlenswert, eben weil sich die Beeinflussungen durch andere und die Beeinflussungen anderer damit vermeiden lassen.

        Der müsste natürlich geschützt werden, damit man nicht an die Sessions herankommt.

        Der sollte am besten gleich außerhalb des DocumentRoots zu liegen kommen. Doch das ist oft nur bei den Providern möglich, die Domains auf Unterverzeichnisse des Kundenverzeichnisses zeigen lassen können. Dieses würde dann zum DocumentRoot werden und "nebenan" ist zugriffsfreier Speicherplatz.

        Ich müsste dann in jeder Datei, in der ich Sessions nutze vor dem session_start(); den Befehl session_save_path(<Pfad>); angeben, oder?

        Ja, oder das in einer anderen PHP-Konfigurationsmöglichkeit angeben.

        echo "$verabschiedung $name";

        1. Hello,

          Der sollte am besten gleich außerhalb des DocumentRoots zu liegen kommen. Doch das ist oft nur bei den Providern möglich, die Domains auf Unterverzeichnisse des Kundenverzeichnisses zeigen lassen können. Dieses würde dann zum DocumentRoot werden und "nebenan" ist zugriffsfreier Speicherplatz.

          oder die Sessions sollten in einem Verzeichnis liegen, dessen Name mit '.ht' beginnt.
          Außerdem kann man den gemeinsamen Garbage Collector auch aussprerren, wenn man dieses Verzeichnis nicht browsable (das r-Recht entziehen) kennzeichnet. Dann kann nur noch gezielt auf Sessiondateien zugegriffen werden, nicht aber mehr mit glob() oder mit readdir().

          Ich müsste dann in jeder Datei, in der ich Sessions nutze vor dem session_start(); den Befehl session_save_path(<Pfad>); angeben, oder?

          oder aber in einer eigenen php.ini (CGI-Variante) oder einer .htaccess-Datei (Modul-Variante) den Wert für session.save_path setzen. Das geht aber nur dann, wenn der Provider das System auch intelligent eingerichtet hat, und den Unterschied zwischen php_admin_value und php_value auch nutzt.

          Harzliche Grüße vom Berg und Frohe Weihnachtszeit

          Tom

          --
          Nur selber lernen macht schlau

          1. Hi,

            Außerdem kann man den gemeinsamen Garbage Collector auch aussprerren, wenn man dieses Verzeichnis nicht browsable (das r-Recht entziehen) kennzeichnet. Dann kann nur noch gezielt auf Sessiondateien zugegriffen werden, nicht aber mehr mit glob() oder mit readdir().

            Und dann - Beine hochlegen, und warten bis das Verzeichnis platzt ...?

            MfG ChrisB

            1. Hello,

              Außerdem kann man den gemeinsamen Garbage Collector auch aussprerren, wenn man dieses Verzeichnis nicht browsable (das r-Recht entziehen) kennzeichnet. Dann kann nur noch gezielt auf Sessiondateien zugegriffen werden, nicht aber mehr mit glob() oder mit readdir().

              Und dann - Beine hochlegen, und warten bis das Verzeichnis platzt ...?

              wär doch was, oder?

              Selber aufräumen mittels Cron-Job.
              Dafür richtet man die Gruppe ein für den Job
              Den User kann man ja nicht nehmen, den benötigt der PHP-Prozess.

              Und dann die Lebensdauer der Datei entsprchend lang einrichten.
              Die Session-Gültigkeit sollte man ohnehin mit der Datenbank überwachen, mit der man doch sicher auch die Zugriffsrechte der einzelnen User steuert.

              Harzliche Grüße vom Berg und Frohe Weihnachtszeit

              Tom

              --
              Nur selber lernen macht schlau

  2. Hi Dengue,

    Trotzdem ist es jetzt so, dass ich mal nur nach wenigen Minuten, aber auch mal erst nach 30 Min. oder später ausgeloggt werde. Die Abstände sind total unregelmäßig. Der Logout erfolgt noch vor Ablauf des Cookies.

    unter PHP gibt es einen sogenannten Garbage Collector (GC), der für das Aufräumen nicht mehr gültiger Sessiondaten zuständig ist. Ab wann Sessiondaten als ungültig angesehen werden, ist in der php.ini-Direktive session.gc-maxlifetime festgelegt und beträgt standardmäßig 1440 Sekunden. Solange die Sessiondaten auf dem Server verfügbar sind, also noch nicht vom GC gelöscht wurden, kann ein Client eine solche Session aufnehmen.

    Nun ist es aber so, dass das Aufräumen ein relativ aufwendiger Prozess ist, weshalb der GC standardmäßig nicht bei jedem Start einer Session gestartet wird, sondern in zufälligen Abständen, welche durch die Direktiven session.gc_probability und session.gc_divisor bestimmbar sind. Es ist also möglich, dass der GC beim ersten Start einer Session nach den 1440 Sekunden die Sessiondaten löscht, genauso gut könnte er auch erst nach $beliebige_zahl Sekunden aktiviert werden.

    Gruß,
    Andreas.