Sessions: Auto-Logout und Inaktivität

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

  • Sessions: Auto-Logout und Inaktivität

    Hallo zusammen,

    2 Fragen zum Thema Sessions, dafür muss ich aber ein wenig ausholen:

    Ich habe mir ein Login-System folgendermaßen gebastelt:

    index.php -> enthält das Formular zur Eingabe von Benutzername und Passwort und verweist auf die login.php

    login.php -> hier werden die eingegeben Formulardaten mit denen in der DB überprüft, und entweder wird auf die nächste Seite (home.php) oder zurück auf die index.php verwiesen. Desweiteren erstelle und registriere ich hier Sessionvariablen (a la $_SESSION["login_id"] = $data["id"]; ) und trage die session_id in die DB ein.

    Auf der home.php und den Nachfolge-Seiten wird natürlich als erstes immer die Überprüfungs-Seite eingelesen (per include), um festzustellen, ob man eingeloggt ist oder nicht.

    Überprüfungsseite (check.php):
    session_start ();
    if (!isset ($_SESSION["login_id"]))
    {
    header ("Location: error.php");
    }

    Natürlich gibt es noch die obligatorische logout.php, wo die Session beendet wird, und der Wert in der DB wieder auf NULL gesetzt wird. So weit, so gut.
    Jetzt habe ich natürlich durch unermüdliches Suchen und Stöbern in den Foren festgestellt, das es ja eingeloggte Benutzer geben könnte, die sich nicht über "LOGOUT" ausloggen, sondern einfach nur den Browser schliessen.
    Jetzt möchte ich gerne
    1. Beim Login neben der Session_ID auch das Datum des Logins in die DB übertragen (als timestamp).
    2. Dann sollte ja auch beim Aufruf jeder Seite der Timestamp aktualisiert werden. Das hätte ja den Vorteil, das, wenn der Browser geschlossen wird, Timestamp nicht mehr aktualisiert wird.

    Frage 1: Würde es genügen, in der o.g. Datei check.php (weil die ja sowieso immer von jeder Seite aufgerufen wird) mittels ...else... ein Update in der DB des Timestamps zu erzeugen?
    Frage 2: Wo könnte ich die Abfrage hinsetzen, das, wenn seit z.B. 10 Minuten kein Timestamp aktualisiert wurde, die session_id in der DB wieder auf NULL gesetzt wird und einen Verweis unterbringen a la "Sie haben seit 10 Minuten keine Aktivität gezeigt, bitte neu einloggen." ?

    Muss ich dafür eine neue Datei includen auf jeder Seite im "geschützten Bereich" oder kann ich das irgendwie noch auf der o.g. Datei unterbringen.

    Und irgendwo hab ich gelesen, das das (oder der) timestamp in sql ein anderes Format besitzt als in php, stimmt das? Da müsste ich das doch irgendwie anpassen.

    P.S. Ich habe keinen Zugriff auf die php.ini, wo cih die Dauer der Session beeinflussen könnte.

    Ein Tipp wäre toll

    Liebe Grüße
    Stefan

  • #2
    das problem mit dem ausloggen hast du ja eigentlich nicht, denn wenn der browser geschlossen wird ist ja auch die session gelöscht...

    das mit dem timeout kannst du so lösen: in der tabelle der user hängst du noch eine spalte last_action oder so was dran. beim login schreibst du da die aktuelle zeit rein, und dann hängst du in der datei die bei jeder seite aufgerufen wird (check.php) noch dran, dass er das last_action des users aus der tabelle holt, vergleicht dies mit der aktuellen zeit, wenn dies z.b. länger als 10 min her ist, kommt ne weiterleitung auf timeout.php oder so was, und wenn nicht wird die spalte last_action mit der aktuellen zeit aktualisiert und die angeforderte seite wird angezeigt.

    Kommentar


    • #3
      ich könnte mir eine spalte TIMESTAMP in der datenbank vorstellen.

      user loogt sich ein -> spaltenwert auf NOW() setzen
      user öffnet seite -> abfragen, ob session_id übereinstimmt und die spalte mit der zeitangabe nicht kleiner ist als NOW() - interval.
      falls nicht -> ausloggen
      sonst -> update der Zeitspalte und seite laden.

      gruß jochen

      EDIT:
      ich schreib zu langsam

      Kommentar


      • #4
        Original geschrieben von magman
        das problem mit dem ausloggen hast du ja eigentlich nicht, denn wenn der browser geschlossen wird ist ja auch die session gelöscht...
        Hallo, vielen Dank erstmal euch beiden für die Antwort, aber:
        Die Session ist gelöscht, aber beim "falschen ausloggen per Browser schliessen" ist zwar die tatsächliche Session gelöscht, aber der Wert der session_id ist in der DB nicht auf NULL gesetzt worden.

        Das war erstmal mein Problem.

        Liebe Grüße, Stefan

        Kommentar


        • #5
          bentze doch einfach cronejobs. Damit kannst du dann jede Minute oder so ein script aufrufen, das überprüft, ob der user noch eingeloggt ist, und wenn der Abstand von mir aus 10 minuten seit dem letzten click ist, die session auf Null setzt.

          Kommentar


          • #6
            Wenn du das Posting aufmerksam gelesen hättest, wäre das mit der Db kein Problem!


            das mit dem timeout kannst du so lösen: in der tabelle der user hängst du noch eine spalte last_action oder so was dran. beim login schreibst du da die aktuelle zeit rein, und dann hängst du in der datei die bei jeder seite aufgerufen wird (check.php) noch dran, dass er das last_action des users aus der tabelle holt, vergleicht dies mit der aktuellen zeit, wenn dies z.b. länger als 10 min her ist, kommt ne weiterleitung auf timeout.php oder so was, und wenn nicht wird die spalte last_action mit der aktuellen zeit aktualisiert und die angeforderte seite wird angezeigt.

            Kommentar


            • #7
              Hallo, das hat ja alles hervorragend geklappt, aber,

              Ich habe:

              1. index.php -> enthält NUR das Login-Formular welches auf die login.php verweist
              Frage: Wieso MUSS auf dieser Seite schon als erste Zeile stehen:
              <?php session_start (); ?> ?

              2. login.php (Login-Seite) -> verweist wieder auf index.php, wenn user / passwort falsch, oder auf home.php (Frameset), wenn richtig. Desweiteren werden hier die Sessionvariablen erstellt und registriert und die session_id in die DB übertragen und der Wert der Spalte zeit mit time() gefüllt und ebenfalls in die DB übertragen.

              3. home.php (Frameset): Besteht aus insgesamt 3 Dateien: Frameset (home.php), Navigation (navi.php) und Inhaltsseite (system.php).
              Auf allen diesen 3 Seiten include ich in der ersten Zeile jeweils die Datei verwaltung_check.php, in der überprüft wird, ob die Session existent ist, wenn nicht wird auf eine Fehlerseite weitergeleitet.
              Als zweites include ich auf jeder dieser 3 Seiten die Datei verwaltung_time.php, in der der Wert der Spalte zeit in der DB mit time() aktualisiert wird. Dann wird in dieser Datei abgefragt, ob der letzte Wert der Spalte zeit älter als 900 Sekunden ist, wenn ja, dann wird auf die Datei logout.php verwiesen.
              Dies ist aber nur ein halbautomatischer Logout, weil ja von dem Benutzer vor der Abfrage, wie lange die letzte Aktion her ist, eine Aktion verlangt wird.
              In der logout.php wird die Session beendet, die Spalten in der DB für die session_id und zeit werden wieder auf NULL gesetzt.

              Dazu 2 Fragen:
              1. in der Datei verwaltung_check.php steht nur folgendes:
              <?php
              session_start ();

              if (!isset ($_SESSION["login_id"]))
              {
              header ("Location: error.php");
              }
              ?>

              Ich habe jetzt versucht, die Daten, die in der Datei verwaltung_time.php stehen auch noch auf dieser Seite unterzubringen. Aber egal wie ich das mache (mit ...else..., innerhalb der Klammern, ausserhalb der Klammern etc.), sie werden zwar verarbeitet, aber es wird nicht auf die Ursprungsseite zurückgegangen. Warum nicht?

              2. Wie kann ich das Problem lösen, das die Verarbeitung der Daten in der logout.php auch dann stattfindet, wenn der Benutzer nach über 900 Sekunden keine Aktion mehr ausführt?

              Mir leuchtet irdenwie nicht ein, wie ich irgendwo festsetzen kann, das der Wert der Spalte zeit sich seit 900 Sekunden nicht geändert hat, ohne das noch irgendwo eine Seite aufgerufen wird (eben per include nach Aufruf einer Seite), die diese Abfrage beinhaltet.

              Weiss da von Euch jemand Rat?

              Vielen Dank
              Stefan

              Kommentar

              Lädt...
              X