Abgelaufene Session
Levent
- php
hi,
wenn ich mich einlogge auf meiner kleine seite wird eine session angelegt. die ist glaube ich serverseitig (bei kontent.de) auf 30 min begrenzt oder so .. wenn ich 30 min nix mache und dann einen link anwähle kommt halt diese unschöne fehlermeldung von wegen, session abgelaufen. wie müsste denn die abfrage lauten damit ich dem user (mir ;) sagen kann das ich mich erneut einloggen soll ?
gruss
ich
Hallo,
if(!session_is_registered('name'))
{
echo "Bitte einloggen";
}
MFG
Andavos
Hi!
if(!session_is_registered('name'))
{
echo "Bitte einloggen";
}
Das machst nur Sinn wenn Du den Garbage-Collector des Session-Moduls auf 100% stelltst, was normalerweise nicht Sinn der Sache ist.
Außerdem sollte man diese Art von Funktionen meiden und die neuen $_SESSION - Variablen verwenden.
Grüße
Andreas
hi,
if(!session_is_registered('name'))
{
echo "Bitte einloggen";
}Das machst nur Sinn wenn Du den Garbage-Collector des Session-Moduls auf 100% stelltst, was normalerweise nicht Sinn der Sache ist.
was hat der garbage colector damit zu tun?
der sorgt m.E. nur dafür, die nicht mehr benötigten session-dateien aus dem session-verzeichnis zu entfernen.
ob eine session aber noch _aktiv_ ist oder nicht, prüft php m.W. nicht anhand der tatsache, ob die zugehörige session-datei noch vorhanden ist, sondern anhand eines zeitstempels.
gruss,
wahsaga
Moin!
ob eine session aber noch _aktiv_ ist oder nicht, prüft php m.W. nicht anhand der tatsache, ob die zugehörige session-datei noch vorhanden ist, sondern anhand eines zeitstempels.
Nein, das ist falsch. Wenn du bei deinem Request eine Session-ID übermittelst (egal, wie diese entstanden ist: Per Cookie, URL-Parameter, ob "echt" oder manipuliert), dann lädt PHP beim Befehl "session_start()" die entsprechenden Session-Daten, egal wie spät es ist. Wenn keine entsprechenden Session-Daten gefunden werden, dann bleibt $_SESSION leer, ansonsten kommen die gespeicherten Daten da rein.
- Sven Rautenberg
Hi!
Das machst nur Sinn wenn Du den Garbage-Collector des Session-Moduls auf 100% stelltst, was normalerweise nicht Sinn der Sache ist.
was hat der garbage colector damit zu tun?
der sorgt m.E. nur dafür, die nicht mehr benötigten session-dateien aus dem session-verzeichnis zu entfernen.
Ja, und ich dachte dass Andavos eben diesen Mechanismus zum Überprüfen der "Ablaufzeit" verwendet (man kann einen Timeout für Sessions auch in der php.ini definieren, das wird abhängig von anderen Einstellungen dann bei jedem x. Scriptaufruf überprüft), wobei ich das inzwischen nicht mehr glaube, nur dann weiß ich nicht so recht was es mit der Frage zu tun hat.
ob eine session aber noch _aktiv_ ist oder nicht, prüft php m.W. nicht anhand der tatsache, ob die zugehörige session-datei noch vorhanden ist, sondern anhand eines zeitstempels.
Das kann man machen wie man will. Die Methode mit dem Timestamp als Session-Variable hatte ich oben ebenfalls genannt.
Grüße
Andreas
Hallo,
if(!session_is_registered('name'))
{
echo "Bitte einloggen";
}
Damit überprüft man doch, ob es die Session name schon gibt. Wenn er jetzt nach 30 Min die Session löscht, so erscheint diese Meldung "Bitte einloggen".
Warum sollte man dies nicht nehmen?
Manuel sagt:
session_is_registered -- Überprüft, ob eine Variable in einer Session registriert ist
Wenn Sie $HTTP_SESSION_VARS/$_SESSION verwenden, sollten Sie session_register(), session_is_registered() und session_unregister() nicht verwenden.
Also man kann beides nehmen, aber ich finde das mit session_is_registered leicher zu verstehen
MFG
Andavos
Hallo Andavos,
Also man kann beides nehmen, aber ich finde das mit session_is_registered leicher zu verstehen
aber nur wenn register_globals auf on steht - bei off funktioniert zumindest session_register nicht mehr (ich nehme an, session_is_registered() auch nicht), siehe http://de.php.net/session_register.
Grüße aus Nürnberg
Tobias
Moin!
Warum sollte man dies nicht nehmen?
Weil man nur noch die Variable $_SESSION verwendet soll, und nicht mehr globale Variablen, deren Eigenschaft "ich bin eine Session-Variable" man von außen nicht sehen kann - was durchaus zu Problemen führen könnte, wenn man ungeschickt mischt.
Manuel sagt:
Manuel? Oder Manual? :)
session_is_registered -- Überprüft, ob eine Variable in einer Session registriert ist
Korrekt. Das braucht man, wenn man nicht weiß, ob eine der globalen Variablen eine Session-Variable ist, oder nicht.
Wenn Sie $HTTP_SESSION_VARS/$_SESSION verwenden, sollten Sie session_register(), session_is_registered() und session_unregister() nicht verwenden.
Weil es zu unerwünschten Überlappungseffekten kommen kann. mit session_register() & Co. werden die so registrierten Variablen in das Array $_SESSION verfrachtet. Der doppelte Zugriff muß auf jeden Fall vermieden werden.
Die Alternative zu session_is_registered wäre isset($_SESSION[...]).
Also man kann beides nehmen, aber ich finde das mit session_is_registered leicher zu verstehen
Man muß sich für eines von beiden entscheiden. Da man $_SESSION nehmen soll, weil es die globalen Variablen sehr komfortabel aufräumt (man soll ja schließlich auch $_POST, $_GET etc. nehmen), ist für session_register(), session_is_registered() und weitere Funktionen einfach keine Verwendung mehr.
Mir gefällt der Zugriff über $_SESSION außerdem wesentlich besser. Der Gedanke, dass es ein spezielles Array gibt, welches durch den Session-Mechanismus immer wiederhergestellt wird und ich bei Bedarf auf dessen Inhalte zugreifen kann, gefällt mir wesentlich besser, als wenn ich um alle meine globalen Variablen, die ich verwende, Angst haben muß, weil ich sie vielleicht irgendwo in einem Teilskript als Session-Variable registriert habe - dann wird sie nämlich durch den Befehl session_start() auch in allen anderen Skripten überschrieben. Und in so einem Müll dann Fehlersuche zu betreiben ist äußerst eklig!
- Sven Rautenberg
Hi!
if(!session_is_registered('name'))
{
echo "Bitte einloggen";
}Damit überprüft man doch, ob es die Session name schon gibt.
Nein, definitiv nicht. Damit prüfst Du ob in der aktuellen Session eine Variable mit dem Namen "name" existiert.
Hat denselben Effekt wie:
if(!isset($_SESSION['name'])) {
echo "Bitte einloggen";
}
Wenn er jetzt nach 30 Min die Session löscht, so erscheint diese Meldung "Bitte einloggen".
Seine Frage war glaube ich, eben wie man das nach 30 Minuten löscht!
Warum sollte man dies nicht nehmen?
Weil es in diesem Fall keinen Sinn macht, und da die 2., von mir beschriebene Zugriffs-Variante verwendet werden sollte, wie Sven auch beschrieben hat.
Manuel sagt:
Welcher Manuel?
session_is_registered -- Überprüft, ob eine Variable in einer Session registriert ist
ach der "Manual" ;-)
Ja, das ist richtig, und dann vegleiche diesen Satz mal mit Deinem:
"Damit überprüft man doch, ob es die Session name schon gibt."
Beachte: Session != Session-Variable
Wenn Sie $HTTP_SESSION_VARS/$_SESSION verwenden, sollten Sie session_register(), session_is_registered() und session_unregister() nicht verwenden.
Also man kann beides nehmen, aber ich finde das mit session_is_registered leicher zu verstehen
Dazu aus dem Manual:
"Aus Gründen der Verbesserung der Sicherheit und der Lesbarkeit des Codes wird die Verwendung von $_SESSION (oder $HTTP_SESSION_VARS bei PHP 4.0.6 oder niedriger) empfohlen. Mit $_SESSION werden die Funktionen session_register(), session_unregister() und session_is_registered() nicht benötigt. Auf die Session-Variablen kann wie auf jede normale Variable zugegriffen werden."
Quelle: http://de3.php.net/manual/de/ref.session.php#session.examples
Noch Fragen?
Grüße
Andreas
Hallo,
Noch Fragen?
Ja,
ich habe ihn so verstanden:
|wenn ich mich einlogge auf meiner kleine seite wird eine session angelegt. die ist glaube ich serverseitig (bei kontent.de) auf 30 min begrenzt oder so .. wenn ich 30 min nix mache und dann einen link anwähle kommt halt diese unschöne fehlermeldung von wegen, session abgelaufen. wie müsste denn die abfrage lauten damit ich dem user (mir ;) sagen kann das ich mich erneut einloggen soll ?
Ich verstehe es so:
Der Server löscht Session Cookies, die älter als 30 min sind.
Wenn er es so meint, würde mein Code auch gehen.
Wenn er aber die Cookies nach 30 Min löschen will, würde es nicht gehn.
Aber er sagt, der Server begrenzt die Zeit auf 30 Min.
MFG
Andavos
Moin!
Ich verstehe es so:
Der Server löscht Session Cookies, die älter als 30 min sind.
Der Server löscht überhaupt keine Cookies.
Wenn er es so meint, würde mein Code auch gehen.
Da der Server keine Cookies löscht, sondern allenfalls die auf dem Server abgelegten Session-Daten, würde dein Code natürlich bei Fehlen der Session-Daten entsprechend verzweigen.
Die Frage ist aber: Woher kommt diese "unschöne Fehlermeldung von wegen Session abgelaufen"? Wer generiert die? Von PHP ganz allein kommt die mit Sicherheit nicht, wenn, dann ist die in PHP programmiert. Wenn man nämlich keine entsprechende Fehlermeldung einbaut, arbeitet PHP wunderbar ohne.
Wenn er aber die Cookies nach 30 Min löschen will, würde es nicht gehn.
Aber er sagt, der Server begrenzt die Zeit auf 30 Min.
Man darf sich nie auf clientseitiges Wohlverhalten verlassen. Der Browser muß ein 30 Minuten gültiges Cookie nicht nach 30 Minuten gelöscht haben. Kann ja sein, dass in der Zwischenzeit die (vorher) verstellte Uhr korrigiert wurde. Dann wäre das Cookie viel länger aktiv.
- Sven Rautenberg
Hi!
Ich verstehe es so:
Der Server löscht Session Cookies, die älter als 30 min sind.
Cookies löscht der Server schonmal gar nicht von alleine (btw. gibt es auch andere Wege eine SessionID zu übertragen), das was PHP macht ist Sessions nach x Sekunden Inaktivität (per default 1440 Sekunden) zu löschen.
Dabei sitzt der Server nicht da und wartet für jede Session exakt x Sekunden, sondern es gibt einen Garbage Collector(GC), der nach einstellbarer Wahrscheinlichkeit beim Scriptaufruf geladen wird, standardmäßig mit der Wahrscheinlichkeit von 0,01.
Dieser GC löscht alle Sessiondateien, die zum Zeitpunkt des Aufrufes abgelaufen sind. Aufgrund der niedrigen Wahrscheinlichkeit ist das nicht wirklich zuverlässig für so einen Mechanismus zu gebrauchen.
Also muss man sich um das löschen selber kümmern, z.B. mit der Timestamp-Methode.
Wenn er es so meint, würde mein Code auch gehen.
Mit PHP nicht, da der Server eben Sessions unregelmäßig löscht.
Wenn er aber die Cookies nach 30 Min löschen will, würde es nicht gehn.
Aber er sagt, der Server begrenzt die Zeit auf 30 Min.
Er wollte wissen wie das funktioniert.
Grüße
Andreas
Hi!
wenn ich mich einlogge auf meiner kleine seite wird eine session angelegt. die ist glaube ich serverseitig (bei kontent.de) auf 30 min begrenzt oder so .. wenn ich 30 min nix mache und dann einen link anwähle kommt halt diese unschöne fehlermeldung von wegen, session abgelaufen. wie müsste denn die abfrage lauten damit ich dem user (mir ;) sagen kann das ich mich erneut einloggen soll ?
Das sicherste ist es bei jedem Scriptaufruf einen Wert in die Session zu schreiben, der den timestamp des aktuellen Besuches enthält. Den Wert prüfst Du dann bei jedem Aufruf, und wenn
if($_SESSION['timestamp_des_letzten_ausfrufs'] + 30*60 < time()) {
logout();
}
else {
$_SESSION['timestamp_des_letzten_ausfrufs'] = time();
}
Grüße
Andreas
Hi!
Ist so natürlich Schwachsinn gewesen ;-)
Besser so:
if($_SESSION['timestamp_des_letzten_ausfrufs'] + 30*60 < time()) {
logout();
exit;
}
$_SESSION['timestamp_des_letzten_ausfrufs'] = time();
Oder was weiß ich, irgendwie sowas.
Grüße
Andreas