Ankündigung

Einklappen
Keine Ankündigung bisher.

Session Lebenszeit zur Laufzeit verlängern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Session Lebenszeit zur Laufzeit verlängern

    Hallo zusammen,

    ich hab da mal eine Verständnis-Frage

    Folgende Konfiguration hab ich eingestellt:

    PHP-Code:
    ini_set('session.use_cookies'1);
    ini_set('session.use_only_cookies'1);
    ini_set('session.use_trans_sid'0);
    ini_set('session.gc_maxlifetime'3600);
    ini_set("session.cookie_lifetime"3600);
    ini_set('session.gc_probability'100);
    ini_set('session.gc_divisor'100); 
    Klar meine Session läuft nach genau 1 Stunde ab. Auch das Cookie ist nach 1 Stunde weCH

    Im Hintergrund läuft ein Skript das alle 60 Sekunden ausgeführt wird und prüft ob die Restzeit der Session kleiner als 5 Minuten ist.

    Wenn ja führe ich folgendes aus:

    PHP-Code:
    setcookie(session_name(), session_id(), 3600'/'); 
    Klar ich verlänger die Lebenszeit des Cookies wieder um 1 Stunde.

    Es funktioniert auch alles super, aber ich frage mich WARUM bleibt auf dem Server die Session-Datei bestehen? Wie wird das von PHP gehandhabt? Sobald ein gültiges Cookie kommt übernimmt die Session-Datei ebenfalls die Laufzeit des Cookies? Es müsste doch vom GarbageCollector nach 1 Stunde geschluckt werden - oder?

    Mein eigentliches Vorhaben ist es nach dem Login hat jeder 1 Stunde lang Zeit. 5 Minuten bevor die Session ablaufen würde, möchte ich den User benachrichtigen. Reagiert er nicht auf diese Nachricht - ENDE Session läuft ab, reagiert er mit einem Klick auf diese Nachricht möchte ich die Session eine weitere Stunde am Leben halten.

    Ist das der richtige Weg? Gibt es einen anderen/besseren?

    Schon ein mal vielen Dank vorab und viele Grüße

  • #2
    Es müsste doch vom GarbageCollector nach 1 Stunde geschluckt werden - oder?
    Jain.

    Der Garbage Collector räumt zwar schon die Sessiondateien ab, aber er läuft nicht permanent. Es gibt so was wie eine "Warscheinlichkeit" mit der der GC gestartet wird (siehe session.gc_probability)

    Ist das der richtige Weg? Gibt es einen anderen/besseren?
    Mein Favourit war immer: Session Lebenszeit 10 Minuten, Refresh der Lebensdauer bei jedem neuerlichen Request (wieder 10 Minuten), ansonsten eben Timeout.

    Diese Benachrichtigung finde ich eher nervig..
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Wie verlängerst Du denn die Session beim Request? Ich bin mir nicht sicher durch welche meiner Einstellungen aber meine Session verlängert sich nicht wenn ich die Seite aktualisiere?! Ich denke mal weil ich den GC auf 100/100 gestellt habe oder weil meine cookie.lifetime nicht auf "0" sondern ebenfalls auf der max_gc_lifetime steht.

      Kommentar


      • #4
        http://pt2.php.net/manual/en/functio...kie-params.php
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          Die Session sollte sich auch gesund ernähren, nicht rauchen, keine Drogen, ... Das Übliche halt.

          Dann gibt es da noch auf der einen Seite den GarbageCollector und die Cookie-Laufzeit. Beide laufen autark. Je nach Projekt kann es sinnvoll sein, eine Session ueber 24 Stunden, über 2 Stunden oder über 10 Minuten laufen zu lassen. Bei sehr kurzen Laufzeiten kann es Leute nerven, wenn sie sich zu schnell wieder anmelden müssen. Wenn es um eine BankingApp geht, dann kann die Sessionzeit gar nicht kurz genug sein. Wenn es um eine OfficeApp geht, dann sollte die Session schon über einen Arbeitstag hinweg nicht ständig erneuert werden müssen.

          Bei sicherheitsrelevanten Seiten kann es sinnvoll sein, die GC-Time auf 1 Std zu stellen und das SessionCookie auf "session" (= wenn Browsertab/-fenster geschlossen wird, wird der Keks entsorgt). In dem Fall sollte die SessionID nicht über die BrowserUrl angenommen werden können. Per Standardkonfiguration arbeitet PHP nur mit Cookies, was an sich die beste Methode ist. Allerdings kann man weiter die SessionID über die URL übergeben - PHP nimmt diese an und läd' die Session, ohne dass der betreffende User ein Cookie gesetzt haben muss. Das kann man durch die Direktive use_only_cookies verhindern. Ein Weiteres Sicherheitsmerkmal ist es, wenn man die IP-Adresse des Sessioninhabers in der $_SESSION speichert und beim Laden der Session (session_start()) zusätzlich auf diesen Wert prüft. Beware of evil reverseproxies (Stichwort: X_FORWARDED_FOR).

          Ein ständiges Refreshen der Session kann in manchen Umgebungen auch Sinn machen.

          Das session.gc_probability ist im Übrigen quasi irrelevant. Damit werden nur Sessions weggeräumt, die eh schon tot sind. Nur halt nicht bei jedem Request, sondern nur mit einer Wahrscheinlichkeit von 1:n.

          Kommentar


          • #6
            mh...

            erst einmal Danke für die ganzen Antworten - auch wenn leider keine davon meine Frage beantwortet. Mit der Sicherheit der Sessions kenn ich mich wohl aus und wie meinem ersten Post zu entnehmen ist, vermeide ich es durch die ini_set Einstellungen die SID per URL zu übergeben.

            set_cookie_params muss vor Session Start aufgerufen werden und bringt mich in meinem Fall leider nicht weiter.

            Es gibt bereits eine Session die nach 55 Minuten aktualisert werden soll, wenn der Benutzer noch aktiv ist - die Meldung anklickt - oder nach 60 Minuten "stirbt" wenn die Meldung ignoriert wird. Wenn dann beispielsweise in der 61 Minute ein Request kommt, wird der Benutzer zwangsläugig auf die Logout-Seite umgeleitet.

            Zur Zeit verlängere ich die Lebensdauer mit

            PHP-Code:
            setcookie(session_name(), session_id(), 3600'/'); 
            Aber ist das auch der richtige Weg?

            Ich möchte die Session verlängern, nicht von Anfang an definieren wie lange meine Session gültig ist.

            P.S. wenn ich das mit dem setcookie weglasse, stirbt meine Session immer genau nach der angegeben Zeit auch wenn zwischendurch hundert mal die Seite aktualisert wurde.

            Meines Wissens nach, verlängert (erneuert) sich die Session aber bei jedem Request. Ist das ein Irrtum oder ein Fehler in meinem Skript? Bei einem Skriptfehler - könnte ich mir das mit dem setcookie ja sparen, wenn er behoben werden würde

            Kommentar


            • #7
              Du kannst eigentlich alles in der .ini einstellen. Dann ist session_start() auch alles, was du brauchst. session_start() musst du halt bei jedem Scriptaufruf starten.

              Kommentar


              • #8
                P.S. wenn ich das mit dem setcookie weglasse, stirbt meine Session immer genau nach der angegeben Zeit auch wenn zwischendurch hundert mal die Seite aktualisert wurde.

                Meines Wissens nach, verlängert (erneuert) sich die Session aber bei jedem Request. Ist das ein Irrtum oder ein Fehler in meinem Skript? Bei einem Skriptfehler - könnte ich mir das mit dem setcookie ja sparen, wenn er behoben werden würde

                Kommentar


                • #9
                  Ja, habe ich gelesen. Wo ist der Punkt dabei?
                  Ich kenne dein Skript nicht.

                  Kommentar


                  • #10
                    Hab mein Problem gelöst.
                    Wenn die Direktive session.cookie_lifetime mit einem anderen Wert als 0 gesetzt ist, läuft die Session zwangsläufig ab, es sei denn man überschreibt das Session-Cookie mit einer höheren Lebensdauer. Ist die Direktive mit dem Wert 0 gesetzt, bleibt das Cookie solange bestehen, bis der Browser geschlossen wird, die Session läuft also nicht ab. Das war mein ganzes Problem bzw. meine Frage. Welche Stelle an meinem oben geposteten Skript verursacht das meine Session abläuft. Die Zweite Frage ob es der richtige Weg ist (in diesem Fall) das Cookie einfach mit einer längeren Lebenszeit neu zu schreiben. Eine Antwort wie Ja oder Nein hätte gereicht.

                    Kommentar

                    Lädt...
                    X