Ankündigung

Einklappen
Keine Ankündigung bisher.

Session: Verbleibende Zeit anzeigen

Einklappen

Neue Werbung 2019

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

  • Session: Verbleibende Zeit anzeigen

    Hallo. Und erneut Danke für's Vorbeischauen.

    Wie kann ich die verbleibende Zeit der Session dem Besucher bei Seitenaufruf sichtbar machen?

    Ich habe meine Session-Lebensdauer so eingestellt, daß sie (ohne vorzeitig vom Besucher beendet zu werden) genau einen Tag lang gültig ist. Auf einigen Seiten kann der Benutzer lange Texte eingeben, solange seine Session gültig ist. Um zu vermeiden, daß er sich die Mühe des Textschreibens macht nur um dann festzustellen, daß alles vergebens (weil expired) war, will ich den Service einer ablaufenden Zeit (JavaScript) einrichten, wozu ich aber ermitteln muß, wie lange die Session noch gültig ist, bevor das JavaScript das Sekundenzählen und -anzeigen übernimmt.

    Danke. Mit freundlichen Grüßen,

    Sven
    sigpic
    Vielen Dank für Eure Zeit, Absicht, Mühe und für Eure Ideen. Grüße,
    Sven

  • #2
    Welche Werte hast Du verändert?
    session.gc_maxlifetime hat den vermutlich nicht erwünschten Effekt, denn damit ist nur der Zeitraum zwischen zwei Aufrufen gemeint.

    Kommentar


    • #3
      Und die Session-Dauer verlängert sich automatisch?
      Du musst dir eben merken, wann du session_start() aufrufst und damit deinen Rückwärtscounter initiieren.
      Find die Idee allerdings Quatsch.

      Kommentar


      • #4
        session.gc_maxlifetime definiert nicht die Gültigkeitsdauer zwischen zwei Aufrufen, sondern den Zeitraum ab einem letzten Aufruf, nach dem die Daten einer Sitzung als Müll betrachtet werden. Bis dieser allerdings entsorgt wird, kann die Sitzung auch nach Ablaufen dieser Zeitsanne wieder aufgenommen werden.

        Es gibt für beide Möglichkeiten (absolute Lebensdauer der Session und Zeitspanne zwischen zwei Aufrufen) folgende Lösung:

        Bei jedem Aufruf speicherst du den Zeitstempel (z.B. $_SESSION['session']['atime'] = time() und beim ersten Starten der Session speicherst du diesen zusätzlich (z.B. $_SESSION['session']['start_time']). Zum prüfen der Zeiten addierst du einfach die jeweilige Zeit in der Session mit der jeweiligen Zeitspanne und vergleichst mit dem aktuellen Zeitstempel.

        Absolute Laufzeit - (Startzeit - Aktuelle Zeit) ergibt die verbleibende absolute Laufzet in Sekunden und (erlaubte Zeitspanne zwischen zwei Aufrufen) entspricht natürlich bei einem Aufruf der verbleibenden Zeit, falls dieser Wert für dich interessant ist. Ist beides relevant gilt der kleinere Wert.

        Von dem Wert ziehst du noch ein wegig ab, um die Übertragungszeiten abzufangen und schreibst ihn in deine JavaScript-Funktion.

        Basti

        Kommentar


        • #5
          Hm-hm, verstehe.

          Es gibt also demnach keine eigene PHP-Funktion (noch nicht), die die verbleibende Restzeit anzeigt?

          Ich werde die Idee mit dem Eintragen des Sessionstarts in die Datenbank aufgreifen, und von dort aus die Restzeit kalkulieren.

          Danke an alle,

          Sven
          sigpic
          Vielen Dank für Eure Zeit, Absicht, Mühe und für Eure Ideen. Grüße,
          Sven

          Kommentar


          • #6
            Anstatt das Problem dem User zu zeigen, würde ich es lösen.

            Kommentar


            • #7
              Hi Sven.

              Zitat von SvenLittkowski
              Es gibt also demnach keine eigene PHP-Funktion (noch nicht), die die verbleibende Restzeit anzeigt?
              Wie gesagt, es gibt weder eine absolute Session-Dauer, die man einstellen könnte, noch eine "normale" Session-Lebensdauer, die zuverlässig wäre. In der Regel wird jedoch auf session.gc_maxlifetime vertraut und, falls du diesen Wert brauchst (die Frage, welchen Wert du denn nun brauchst steht immer noch im Raum), dann kannst du ihn einfach mit ini_get() auslesen.

              Ich werde die Idee mit dem Eintragen des Sessionstarts in die Datenbank aufgreifen, und von dort aus die Restzeit kalkulieren.
              Schreib den Wert einfach in die Session und nicht in die Datenbank. Wenn die Session futsch ist, brauchst du den Wert auch nicht mehr, deshalb muss er die Sitzung nicht überstehen.

              Zitat von Zergling
              Anstatt das Problem dem User zu zeigen, würde ich es lösen.
              Was hast du? Klar ist doch, dass ein Benutzer immer nur eine gewisse Zeit hat, bevor die Session stirbt - da wäre die Lösung nur der Umstieg auf ein Protokoll, das die Verbindung hält, oder?

              Eine andere Möglichkeit ist die, die Session-Lebensdauer sehr hoch anzusetzen und ab dem Verstreichen einer kleineren Dauer einen erneuten Login zu fordern. So bleiben die Daten erhalten, die Sitzung jedoch trotzdem einigermaßen Sicher (falls keine anderen Löcher offen gelassen wurden). Hat den Nachteil, dass womöglich eine ganze Menge nicht mehr benötigter Daten viel länger als nötig auf dem Rechner rumliegen.

              Oder eben, die Daten an den Benutzer gebunden in die Datenbank (quasi in eine Tabelle "unfertige Jobs"/"nichtbeendete Wizards" etc.) zu legen und bei erneutem Login von dort aus wieder aufzugreifen.

              Basti

              Kommentar


              • #8
                Zitat von Basti
                Zitat von Zergling
                Anstatt das Problem dem User zu zeigen, würde ich es lösen.
                Oder eben, die Daten an den Benutzer gebunden in die Datenbank (quasi in eine Tabelle "unfertige Jobs"/"nichtbeendete Wizards" etc.) zu legen und bei erneutem Login von dort aus wieder aufzugreifen.
                Das ist zum Beispiel ein sehr guter Lösungsvorschlag.
                Sozusagen ein Recovery. Ich tippe Text, die Session läuft ab, ich schicke den Text ab, der Text wird in die DB unter unfertige Jobs gespeichert, ich darüber benachrichtigt und aber ausgeloggt. Beim erneuten Einloggen komme ich auf die Recovery-Seite und muss den Text erneut senden (mit Hinweis, warum der Text noch NICHT versendet wurde, sonst denkt der User vielleicht, er hat schoneinmal gesendet).
                Danke für die Idee, gefällt mir sehr gut.

                Kommentar


                • #9
                  Hi.

                  Wichtig wäre nur, dass dem Benutzer auf diese Art und Weise nichts untergejubelt werden kann, auch z.B. bestehende unfertige Aktionen überschrieben werden können. Also entweder muss die Session schon noch laufen, oder aber es wird für das Formular bzw. den Wizard etc. eine ID vergeben, unter der serverseitig die Info gespeichert wird, welcher Benutzer das Formular "geordert" hat. Oder ein Hash aus dem das Programm mit einem serverseitig gespeicherten Schlüssel den Benutzer auslesen kann. Müsste man mal genau durchdenken, welche Angriffspunkte / -fläche welche Lösung bietet und wie man das am besten/sichersten gestalten kann.

                  Basti

                  Kommentar


                  • #10
                    Hm stimmt, ist ja garnich so einfach den User eindeutig zu identifizieren, wenn die Session schon abgelaufen ist. Das muss dann praktisch bei jedem Seitenaufruf schon vorgreifend passieren. Denn ein gleichbleibender MD5-Hash für jeden User ist ja nichts anderes als eine weitere ID, ob nun ID=5 oder z.B. HASH=2263e7gshshdz2h625 ist ja (fast) egal für einen Angreifer.

                    Kommentar


                    • #11
                      Ja stimmt, ist nicht gut, einen Request anhand einer ID einem Benutzer zuzuordnen, die für jeden Benutzer konstant ist.

                      Bei einem normalen Formular wäre es wahrscheinlich am einfachsten, beim Erzeugen des Formulars einfach eine ID zu erzeugen und zu dieser serverseitig die Info speichern, welcher User die Seite angefragt hat. Wenn das Formular abgeschickt wird und die Session abgelauen, dann die Daten dazu in die Datenbank packen und das Anmeldeformular ausgeben. Wenn das zurück kommt eine neue Session starten (mit neuer ID) und eben bei jedem Login erstmal in der Datenbank schauen, ob da noch eine Anfrage liegt, die nicht innerhalb der Session zuendegebracht werden konnte.

                      Bei Wizards kann man auf die gleiche Art ja das Wizard-Objekt in die Datenbank legen.

                      Basti

                      Kommentar


                      • #12
                        Was isn Wizard, das meinste ja wohl nich oder: Wiki: Wizard

                        Kommentar


                        • #13
                          Nein, die mein ich nicht.

                          Unter MS Windows gibt es z.B. sog. Assistenten, mit denen du dich durch mehrere Formulare klickst, um Konfigurtionen vorzunehmen oder so. Das wäre ein Wizard, also eine Folge von zusammenhängenden Eingabeseiten.

                          Schau mal z.B. hier:
                          http://xisc.com/wiki/index.php/TWizard und eine Demo:
                          http://xisc.com/demo/prado/examples/wizard.php

                          Basti

                          Kommentar

                          Lädt...
                          X