Ela: Frage zu Sessions

Guten morgen liebe Community,

ich habe ein Problem. Und zwar will ich umsetzen, bei meinem Loggin System der Nutzer nach 20 Minuten auto. inaktiv wird. Ist auch kein Problem, setze dafür einfach die max. lifetime der Session auf 20 Minuten in der php.ini. Mein Porblem ist aber jetzt, dass der User der am surfen gewesen ist angezeigt bekommen soll, warum er ausgeloggt wurde und er auf eine spezielle Seite weitergeleitet wird. Ich hab derzeit keinen Plan wie ich das ganze Umsetzen könnte, jemand von eich eine Idee?

--
ela
  1. Hallo,

    spontan würde ich folgendes vorschlagen:
    Setze keine max lifetime sondern vergleiche nur die erstellungszeit mit der aktuellen zeit. Wenn da mehr als 20 min dazwischen liegen lasse ihn nicht rein udn leite ihn auf die jeweilige seite um.

    mfg
    Alex

  2. Moin!

    ich habe ein Problem. Und zwar will ich umsetzen, bei meinem Loggin System der Nutzer nach 20 Minuten auto. inaktiv wird. Ist auch kein Problem, setze dafür einfach die max. lifetime der Session auf 20 Minuten in der php.ini.

    Diese Methode ist schlecht.

    Die "max. lifetime" hätte richtigerweise lieber "min. lifetime" genannt werden sollen, denn damit konfiguriert man die Zeit, nach der _frühestens_ die Sessiondaten von PHP gelöscht werden.

    Keinesfalls ist aber definiert, dass PHP _exakt_ nach Ablauf dieser Zeit löscht und so die Session ungültig macht. Tatsächlich kommt für diese Aufräumaktion ein Zufallsprinzip zum Einsatz: Nur jeder Xte von Y Zugriffen auf PHP-Seiten (Standard: jeder hunderste, also 1%) löst die Prüfung auf abgelaufene Session-Daten aus.

    Mit anderen Worten: Du brauchst schon eine recht besuchte Site, auf der in relativ kurzer Zeit mindestens 100 Zugriffe erfolgen, damit mit einigermaßen hoher Wahrscheinlichkeit die Löschung veralteter Sessiondaten anläuft.

    Wenn das nicht der Fall ist, kann es durchaus passieren, dass eine Session auch noch drei Wochen aktiv ist.

    Mein Porblem ist aber jetzt, dass der User der am surfen gewesen ist angezeigt bekommen soll, warum er ausgeloggt wurde und er auf eine spezielle Seite weitergeleitet wird. Ich hab derzeit keinen Plan wie ich das ganze Umsetzen könnte, jemand von eich eine Idee?

    Die Lösung ist ganz simpel:

    1. Sorge dafür, dass deine Sessiondaten lange leben. So lange, wie du glaubst, dass es dauert, dass ein Benutzer eine längst abgelaufene Session wieder aufnehmen will. Wenn du die Grenze bei einer Stunde setzt, dann mußt du die max. Lifetime auf eine Stunde setzen.

    2. Integriere Code, der bei jedem Zugriff prüft, ob der gespeicherte Zeitpunkt des letzten Zugriffs länger als deine 20 Minuten zurückliegt. In diesem Fall wird die Session von dir als abgelaufen betrachtet, und du kannst eine entsprechende Fehlermeldung ausgeben.

    3. Integriere Code, der (nachdem die Session als gültig erkannt wurde) den Zeitpunkt des letzten Zugriffs in die Sessiondaten schreibt.

    Solange die Sessiondaten existieren (wie dargelegt ist das _mindestens_ der Zeitraum der max.lifetime), wird dein User durch die Fehlermeldung "Session abgelaufen" geleitet werden. Wurden die Sessiondaten gelöscht, wird er genauso behandelt, wie ein komplett neuer User.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
  3. hi,

    Und zwar will ich umsetzen, bei meinem Loggin System der Nutzer nach 20 Minuten auto. inaktiv wird. Ist auch kein Problem, setze dafür einfach die max. lifetime der Session auf 20 Minuten in der php.ini.

    Bilde dir nicht ein, damit dein "Problem" gelöst zu haben.

    Auch wenn der Name dieser Einstellung, session.gc_maxlifetime, suggeriert, es handele sich um eine "maximale" Lebensdauer, ist ihre Wirkung eigentlich exakt andersherum: Sie ist eine _Mindest_-Lebensdauer. Ab X Sekunden nach dem letzten Zugriff ist eine Session-Datei auf dem Server (bzw. andere gewählte Ablageform für die Daten) zum Löschen durch den Garbage Collector freigegeben - das bedeutet aber noch nicht, dass dieser dann auch zwangsweise aktiv wird, denn sein Aufruf ist zufallsgesteuert (aus gutem Grund, denn bei jedem Request alle Sessions durchzuschauen, wäre reichlich unperformant).

    Mein Porblem ist aber jetzt, dass der User der am surfen gewesen ist angezeigt bekommen soll, warum er ausgeloggt wurde und er auf eine spezielle Seite weitergeleitet wird.

    Wenn die serverseitig abgelegten Session-Daten erst mal entfernt worden sind, hast du gar keine Möglichkeit mehr festzustellen, ob der User in einer "abgelaufenen" Session eingeloggt war, oder noch überhaupt keine gültige Session hatte. Es wird lediglich eine Session-ID übermittelt, der entweder gespeicherte Daten erfolgreich zugeordnet werden können, oder eben nicht.

    Wenn du also eine "Zeitüberschreitung" haben und auf diese auch noch gesondert reagieren willst, musst du dir erst mal einen Mechanismus zur Verfolgung dieser ausdenken.
    Man könnte bspw. vergebene Session-IDs noch zusätzlich irgendwo hinterlegen (Datenbank, Dateien) und abfragen - aber hier stehst du dann u.a. vor dem Problem, dich um die "Müllbeseitigung" innerhalb dieser zusätzlichen Ablage selbst kümmern zu müssen.
    Simpler zu realisieren wäre es bspw., die Lifetime der Sessions generell _heraufzusetzen_, und in der Session jeweils den letzten Zugriffszeitpunkt zu vermerken - dieser könnte dann auf die eingangs genannte Zeitspanne von 20 Minuten abgeprüft werden.
    Ab dem Zeitpunkt, wo die Lifetime der Session überschritten und diese entsorgt wurde, ist natürlich eine solche Unterscheidung zwischen "eingeloggt, aber Zeit überschritten" einerseits und "bisher noch gar nicht erfolgreich eingeloggt" andererseits nicht mehr machbar, siehe oben.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }