Samuel Vogel: session.gc_maxlifetime geht nicht

Hallo,

Ich versuche gerade eine Session mit "session.gc_maxlifetime" zu beenden baer man wird komischerweise nicht ausgeloggt. Ich habe das in den header gepackt:

ini_set("session.gc_maxlifetime", 30);

ich schaue ob der User eingeloggt ist indem ich überprüfe ob eine UserID existiert oder nicht und eigentlich sollte die ja nach 30sec. nicht mehr existieren.

Und dann hab ich noch ´ne Frage:
Ist es sinnfoll die IP wenn sich der User einloggt mit zu speichern und dann auch zu üperprüfen auf jeder seite ob die $_SESSION['ip'] immer noch die neue IP ist. Und wenn ja dann bräuchte ich auch noch die Funktion um die IP des Users auszulesen. Ich würde diese Funktion übrigens deaktivierbar machen im User-Profil.

PS: Übergebe die SESSIONID im Link

samy,

  1. Hello,

    da solltest Du auf jeden Fall hier mal die Suche bemühen und die Worte "Session" und "lifetime" oder "Lebensdauer" eintippen. Es lohnt sich.

    Nur in Kurzform:

    1. Es müsste eigentlich heißen "session.min_lifetime", da vor Ablauf dieser
       Zeit seit der letzten Dateibenutzung keine Sessiondatei gelöscht wird

    2. Jedes Script, dass session_start() aufruft, stößt den Aufräumvorgang
       an. Du müsstest das also in allen Scripten schreiben
       Die angegebene Zahl ist in Sekunden.

    3. Ob ein Löschdurchgang vorgenommen wird, hängt aber noch von einer
       Wahrscheinlichkeit ab, die maximal 1 sein kann. Je mehr Scripte
       beteiligt sind, desto öfter wird der Aufräumvorgang also angestoßen.
       Ein Script kann sich niemals die eigene Session "aufräumen", da es
       erst die Sessiondatei ausliest, und dann erst den Aufräumvorgang
       startet. Da aber die Datei gerade eine Millisekunde vorher benutzt
       wurde, steht si nicht zur Löschung an.

    4. Sessiondateien einer laufenden Session entfernt man mit
       session_destroy(). Mit session_unset() kann man nur die
       Sessionvariablen des Scriptes killen und mit setcookie($session_name())
       vernichtet man den Cookie auf der Clientseite (sofern die Session
       mit Cookie läuft)

    5. Session und Login haben nur indirekt miteinander zu tun.
       Eine Session ist noch kein Login, aber ein Login erfordert
       die Führung von SessionID oder sonstigen Credentials (Auth401 ->
       User:Passwort)

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Danke ersmal,

      Und wenn ich alles richtig verstanden habe kann man eine Session nicht nach einer bestimmmten Zeit löschen

      samy,

      1. Hello,

        Und wenn ich alles richtig verstanden habe kann man eine Session nicht nach einer bestimmmten Zeit löschen

        Jein. Es ist so nicht vorgesehen. Natürlich kann man sich selber etwas basteln. Allerdings gibt es kein durchgängiges Modell, um alle Stellen zu erreichen, an denen man etwas tun müsste.

        Wer entscheidet, ob die Session gelöscht wird?
        Wer entscheidet, wann die Session gelöscht wird?
           Wie soll das getriggert werden?

        Im Prinzip könnte man einen Cronjob auf die Sessiondatien ansetzen, der aller Minut schaut, ob die Lebensdauer schon abgelaufen ist. Davon bekommt aber der Client nichts mit und das von ihm angestoßene Script (Request) auch nicht. Das weiß nun nicht, warum die Sessiondatei nicht mehr da ist und würde, da ja die SessionID brav vom Client geliefert wurde, einfach eine neue Sessiondatei anlegen.

        Und daran siehst Du auch, wo das Login vermerkt sein könnte: In der Sessiondatei. Da könntest Du einen pro Session individuellen Timestamp für "logged since", "last request" und eine universelle Zeit für "logout after x minutes of idle" eintragen.

        Wenn der Client nun den nächsten Request schickt, prüfst Du erst, ob das noch "In Time" ist. Wenn ja, wird "last request" aktualisiert, sonst wird die Session gekillt. -> Leeren Cookie an den Client, session_destroy().

        Das kann man alles in einer Funktion verpacken, die automatisch durch ein include am Anfang jedes Scriptes aufgerufen wird.

        Session starten
        Prüfen
        Maßnahmen ergreifen

        • Anmeldung verlangen
        • Abmeldung miteilen
        • arbeiten lassen

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. OK,

          aber ich willes so machen dass wenn der user das Browserfentser schließt er auch ausgeloggt weden soll, also nach 15 min. unaktivität oder so.

          Und da geht diese überprüfung ja nicht!

          samy,

          1. Hello,

            aber ich willes so machen dass wenn der user das Browserfentser schließt er auch ausgeloggt weden soll, also nach 15 min. unaktivität oder so.

            Wenn Du Sessions mit temporären Cookies fährst, verliert der user die SessionID, wenn er seinen Browser schließt.

            Ich würde ihm aber besser einen "Logout" anbieten. Logout macht man dann, indem man in der Sessiondatei des Clients einfach den passenden Schalter umlegt. Also z.B. "logged since" auf false setzt.
            ACHTUNG
            0==false   ist wahr
            0===false   ist falsch

            Wenn Du also schauen willst, ob jemand eingeloggt ist, reicht es, danach zu fragen, ob

            if (isset($_SESSION["logged_since"]) and ($_SESSION["logged_since"] > 0))
            {
              # hurra, User ist angemeldet
            }

            0 beim Timestamp würde dem 01.01.1970 00:00 entsprechen. Und so lange ist noch keiner Deiner User angemeldet, oder?
            Negative Werte benötigst Du also nicht.

            if (isset($_SESSION["last_request"])
                and (time()-$_SESSION["last_request"]) < MAXWAIT )
            {
              # hurra, Session ist noch frisch
              $_SESSION["last_request"] = time();
            }

            Die Schachtelung der IFs musst Du selber vornehmen...

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        2. Moin!

          Und wenn ich alles richtig verstanden habe kann man eine Session nicht nach einer bestimmmten Zeit löschen

          Das muß man ja auch nicht, es reicht ja, nach Ablauf einer Zeitspanne seit der letzten Aktivität den Zugriff mit der jeweiligen Session-ID zu verweigern.

          Im Prinzip könnte man einen Cronjob auf die Sessiondatien ansetzen, der aller Minut schaut, ob die Lebensdauer schon abgelaufen ist. Davon bekommt aber der Client nichts mit und das von ihm angestoßene Script (Request) auch nicht. Das weiß nun nicht, warum die Sessiondatei nicht mehr da ist und würde, da ja die SessionID brav vom Client geliefert wurde, einfach eine neue Sessiondatei anlegen.

          Die Sessiondateien würde ich überhaupt nicht anfassen. Die sind einzig und allein Sache der Verwaltung von PHP.

          Und daran siehst Du auch, wo das Login vermerkt sein könnte: In der Sessiondatei. Da könntest Du einen pro Session individuellen Timestamp für "logged since", "last request" und eine universelle Zeit für "logout after x minutes of idle" eintragen.

          Exakt.

          Jeder Befehl "session_start()" sollte gefolgt werden von einer Prüfung, ob die Session noch aktuell ist:

          Testen, ob eine dafür vorgesehene Session-Variable existiert.

          • Wenn ja: Darin ist die Zeit des letzten Zugriffs gespeichert - liegt die Zeit innerhalb der letzten X Minuten?
            • Wenn nein: Session-Daten komplett löschen: $_SESSION=array();
            • Wenn ja: Alles ist gut.
          • Wenn nein: Session ist neu. Alles ist gut.

          Jetzt in die Session-Variable die aktuelle Zeit eintragen.

          Und in der Folge wird das Skript entsprechend der vorhandenen Session-Daten entscheiden müssen, ob der Benutzer eingeloggt ist, und welche Seite/Aktion kommen soll, wenn das nicht der Fall ist. Diese Programmierung ist aber unabhängig von irgendwelcher zeitlichen Begrenzung und müßte ohnehin geschehen.

          Wenn der Client nun den nächsten Request schickt, prüfst Du erst, ob das noch "In Time" ist. Wenn ja, wird "last request" aktualisiert, sonst wird die Session gekillt. -> Leeren Cookie an den Client, session_destroy().

          Warum die Session killen? Sessiondaten leeren ist vollkommen ausreichend. Die Session-ID kann doch gerne weiterverwendet werden.

          - Sven Rautenberg

          --
          "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
          (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)