php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.08.2006, 15:20  
Neuer Benutzer
 
Registriert seit: 12.10.2005
Beiträge: 7
Arnd
Standard Sessiondauer erhöhen

Hallo Forum,

ich baue gerade eine Schreib-Workshop-Umgebung und benutze dazu das beliebte Forum My little Forum als Grundlage.

Nun habe ich festgestellt, daß die Session nach einer gewissen Zeit der Inaktivität verfällt. Leider habe ich trotz Stöberns und Googelns nicht finden können, wie ich den Timeout so erhöhen kann, daß niemand zu früh rausgeschmissen wird.

Man muß sich das so vorstellen: Das ist eine Schreib-Workshop. Die Leute schreiben vielleicht stundenlang an einem Text und wollen ihn dann abschicken - vielleicht unterbrechen sie zwischendrin sogar die Netzverbindung. Und wenn sie dann abschicken, kommt plötzlich die Loginseite und die Arbeit ist vernichtet - das darf nicht passieren!

Alles was ich bisher gefunden habe war:

ini_set("session.gc_maxlifetime", time()+(3600*24*7*52*10));

... sollte die Laufzeit auf zehn Jahre setzen, ist das korrekt?

Herzlichen Dank für Hinweise!

Gruß Arnd
Arnd ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.08.2006, 17:46  
Erfahrener Benutzer
 
Registriert seit: 11.07.2004
Beiträge: 269
function
function eine Nachricht über ICQ schicken
Standard

ja das dürfte 10 jahren entsprechen
__________________
Es ist ein großer Trost, andere dort scheitern zu sehen, wo man selbst gescheitert ist. (William Somerset Maugham)
function ist offline  
Alt 31.08.2006, 18:21  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Hi.

Keine gute Idee, den Müllschlucker die Daten est nach 10 Jahren vernichten zu lassen.

Den Wert, den du da gefunden hast, der bezieht sich eben auf den Garage Collector. Der wird bei jedem Skriptaufruf innerhalb einer Session mit einer einstellbaren Wahrscheilichkeit (default: 1%) aufgerufen, um die veralteten Session-Daten zu löschen.

Dieser Mechanismus wird von vielen Programmierern als ausreichend angesehen, die Session-Laufzeit festzulegen, woraufhin die dann keine Prüfung explizit programmieren. In deinem Fall hieße das, dass die Sitzungen zehn Jahre lang wieder aufgreifbar sind. Kannst dir ja mal ausrechnen, wie viele Session-ID's dann in einigen Monaten/Jahren "im Umlauf" sind und ob dir das noch reicht an Sicherheit.

Hat der Programmierung selbst für die Überprüfung der Session-Laufzeit gesorgt, dann hilft es nichts, den Müllschlucker nach Hause zu schicken. In dem Fall such mal nach einer Session-Klasse oder so...

Basti
Basti ist offline  
Alt 31.08.2006, 19:58  
Neuer Benutzer
 
Registriert seit: 12.10.2005
Beiträge: 7
Arnd
Standard

Hallo,

danke Euch für die Hilfe. Der Wert war nur ein Beispiel, ich will nicht wirklich die Session auf zehn Jahre setzen. 24 Stunden wäre vielleicht akzeptabel.

Das Zwangsausloggen passiert aber regelmäßig nach einer bestimmten Zeit - nicht nur mit einer Wahrscheinlichkeit von 1%! Und auch mit den Skripten, die ich selber geschrieben habe, und da prüfe ich nur eingangs:

session_start();

if (!isset($_SESSION[$settings['session_prefix'].'user_id']))
{
header("location: ../login/login.php");
exit;
}

Sonst nichts...

Wie gesagt, es muß nur zuverlässig verhindert sein, daß der skizzierte Fall eintritt und Leute zwangsausgeloggt werden, während sie noch was machen.

Was ich überhaupt nicht kapiere, ist, welche Funktion die Checkbox "automatisch einloggen" bei My Little Forum erfüllt, und ob das was damit zu tun hat - dem Augenschein nach nämlich nicht. Seltsam.

Arnd
Arnd ist offline  
Alt 31.08.2006, 22:35  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Zitat:
Zitat von Arnd
Das Zwangsausloggen passiert aber regelmäßig nach einer bestimmten Zeit - nicht nur mit einer Wahrscheinlichkeit von 1%! Und auch mit den Skripten, die ich selber geschrieben habe, und da prüfe ich nur eingangs:

session_start();

if (!isset($_SESSION[$settings['session_prefix'].'user_id']))
{
header("location: ../login/login.php");
exit;
}
Dann schau dir mal deinen Wert von session.gc_probability (oder so ähnlich) an. Übrigens ist folgendes angenehmer:
$_SESSION[$settings['sess_prefix']]['user_id'];

Und, der Location-Header sollte einen absoluten URL erhalten (und Location groß geschrieben sein). Siehe rfc2616 14.30


Zitat:
Wie gesagt, es muß nur zuverlässig verhindert sein, daß der skizzierte Fall eintritt und Leute zwangsausgeloggt werden, während sie noch was machen.
Da hilft nur, die Daten zu speichern und nach einer Login-Bestätigung weiterzuverarbeiten. Ist allerdings nicht trivial, das sicher einzubauen.

Zitat:
Was ich überhaupt nicht kapiere, ist, welche Funktion die Checkbox "automatisch einloggen" bei My Little Forum erfüllt, und ob das was damit zu tun hat - dem Augenschein nach nämlich nicht. Seltsam.
Ich tippe mal ins blaue, dass das Ausloggen dennoch passiert und der Benutzer dann eben wieder automatisch eingeloggt wird, dabei aber seine Session verliert (was ja auch eigentlich korrekt ist - also das Löschen der alten Session bei einem Statuswechsel, nict natürlich das "erst Aus-, dann automatisch wieder einloggen". Das ist natürlich quatsch - falls dem überhaupt so ist).

Basti
Basti ist offline  
Alt 01.09.2006, 09:54  
Neuer Benutzer
 
Registriert seit: 12.10.2005
Beiträge: 7
Arnd
Standard

Hi,

erst mal danke für Eure Antworten. Nur schlauer bin ich immer noch nicht. Es kann doch nicht wahr sein daß es unmöglich ist die Dauer der Session festzulegen.
Ich habe mal testweise

ini_set("session.gc_maxlifetime", 10) or exit("nein.");

im Login-Skript und wieder auf der ersten Seite die kommt, jeweils VOR der Session-Eröffung eingesetzt. Demnach müßte ich nach 10 Sekunden rausgeschmissen werden, wenn ich neu lade.

NICHTS. Kein Effekt. Ich tappe völlig im Dunkeln, suche seit Stunden im Netz nach Hinweisen, aber alles was ich finde sind FRAGEN wie meine in Foren, auf die dann niemand was weiß.

Offenbar schwarze Magie.

Arnd
Arnd ist offline  
Alt 01.09.2006, 13:52  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Zitat:
Zitat von Arnd
ini_set("session.gc_maxlifetime", 10) or exit("nein.");

im Login-Skript und wieder auf der ersten Seite die kommt, jeweils VOR der Session-Eröffung eingesetzt. Demnach müßte ich nach 10 Sekunden rausgeschmissen werden, wenn ich neu lade.
Nein. Wie gesagt, es geht dabei um den Müllschlucker. Wenn die Session-Datei da ist - egal, wie alt, dann wird sie verwendet. Wenn du eine Session startest, dann wird der Garbage Collector auch nur mit der angegebenen Wahrscheinlichkeit angeworfen. Also einfach mal session.gc_probability und session.gc_divisor (oder so ähnlich) auf den gleichen Wert setzen und nochmal probieren.

Andererseits hab ich mal gelesen, das der GC erst nach dem Starten der Session angeworfen wird. Das würde dann bedeuten, dass du dich niemals selbst aus einer Session kicken kannst (mit der Satndard-Implementierung). In dem Fall lass mal zwei Sessions laufen und teste so.

Die PHP-Session-Funktionen sind einfach sehr grundlegend, weden von einigen Programmierern aber eben einfach nur so benutzt, ohne sich weiter drum zu kümmern. Das ist eine ziemlich unschere und wackelige Geschichte dann. Insofern würd ich erst mal schauen, ob deine Anwendng da eine gescheite Implementierung der Sitzungssteuerung hat und wenn nicht, dann man im aktuellen svn- bzw. csv-snapshot schauen (falls Open Source) und das einfach mal gescheit einbauen.

Noch was prinzipiell zu Sessions (vielleicht ilfreich zum testen):
Wenn die Session-Datei vom GC gelöscht wurde, der Client aber noch die alte Session-ID mitschickt, wird eine Datei mit dem gleichen Namen angelegt, wie die alte Session-Datei (was man in der Implementierung der Sitzungssteuerung normalerweise aus sicherheitsgründen rückgängig macht, Stichwort Session-Fixation).

Nochwas: Wenn mehrere Anwendungen den selben Session-Save-Path verwenden, dann löscht jede Anwendung natürlich blind alle Sessions, die aus ihrer Sicht abgelaufen sind. Wenn du auf dem Server also noch eine Anwendung hast, die 10 Minuten-Session verwendet und die das selbe Verzeichnis benutzt, wie eine Anwendung mit 10 Stunden-Sessions, dann löscht die eine natürlich auch die Sessions der anderen Anwendung schon nach 10 Minuten.

Sinnvoll ist also immer folgende Vorgehensweise:
- eigenen Speicherpfad;
- GC möglichst lange hinhalten (hängt natürich vom Plattenplatz ab, den du dafür verwenden kannst);
- In der Session die Startzeit und die Zeit des letzen Zugriffs speichern und ggf. abgleichen. Ich benutze immer zwei Zeiten: Eine absolute (jetzt - Startzeit) und eine "relative" (Zeit seit dem letztem Klick), wobei sich die absolute auch auf 0 setzen lässt und dann eben nicht geprüft wird.

Dann natürlich das übliche:
- Beim Start der Session (erster Aufruf) und bei jedem Statuswechsel die Session-ID ändern;
- Gegebenenfalls noch einen Fingerprint vom Client speichern (nicht die IP, aber die Browser-Header eben);
- vor jedem Abbruch des Skrites ein session_write_close();

Wichtig ist einfach, dass die Daten der Session auch dann noch da sind, wenn der Benutzer eigentlich schon zu lange Inaktiv war (im Rahmen natürlich), um dann entsprechend darauf reagieren zu können (z.B. Passwortbestätigung).

Nochmal in Kurzform:
Entweder die Anwendung keinnt eine banale Konfigurations-Option zur Session-Laufzeit, oder sie verwendet intern einen fest einprogrammierten Wert (in beiden Fällen kannst du das leicht ändern und dann sollte das auch funktionieren). Wenn nicht, dann musst du dich in die Sitzungssteuerung erstmal einarbeiten um die Anwendung um deine Wünsche zu erweitern. Vielleicht ist es damit getan, den Save-Path umzulegen (muss man auf shared hosts ohnehin immer!) und die Zeit des gc hochzusetzen.

Basti
Basti ist offline  
Alt 01.09.2006, 23:56  
Benutzer
 
Registriert seit: 16.10.2004
Beiträge: 90
freitz
Standard

machs doch einfach so dass wenn der text abgeschickt wird und man zu lange inaktiv war dann wird nochmal login daten verlangen und danach abspeichern. damit sollte dein problem doch völlig gelöst sein?!
__________________
mgtt 2007
freitz ist offline  
Alt 02.09.2006, 00:15  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Das Problem dabei ist, die Eingabe auch wirklich dem Benutzer zuordnen zu können. Bei Foren-Postings kann man das sicher vernachlässigen, aber es ist sicher wichtig zu wissen, dass so prinzipiell ein Angreifer eine bestimmte Eingabe vorbereiten und einem Benutzer des Systems unterjubeln kann. Der Loggt sich nichtsahnend ein und schon wird die vorbereitete Eingabe des Angreifers mit den Rechten des Benutzers ausgeführt.

Und, um die Eingabe zuordnen zu können, brauchst du eben eine Session.

Basti
Basti ist offline  
Alt 02.09.2006, 11:15  
Neuer Benutzer
 
Registriert seit: 12.10.2005
Beiträge: 7
Arnd
Standard

Hallo Basti,

ich habe mir Deine Hinweise gespeichert, vielen Dank dafür. Leider größtenteils böhmische Dörfer, aber ich merke mir das mal.
Meine Session-Behandlung beschränkt sich im Grunde auf den o.g. Zeilen. Vom Provider habe ich den Hinweis erhalten, daß ich mit einem Eintrag in einer .htaccess-Datei die Sessiondauer erhöhen kann:

php_value session.gc_maxlifetime 3600

Das mit dem header-Befehl funktioniert zwar, aber offenbar nur auf Kulanzbasis; das verbessere ich noch.

Herzliche Grüße

Arnd
Arnd ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sessiondauer festlegen PHP Tipps 2005 9 08.04.2005 22:10
Sessiondauer / Cookies ? PHP Tipps 2005 7 15.02.2005 21:28

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
session.gc_maxlifetime erhöhen, php session dauer, php session dauer einstellen, session.gc_maxlifetime verändern, http://www.php.de/php-tipps-2006/41921-sessiondauer-erhoehen.html, php script laufzeit erhöhen, php session laufzeit erhöhen, php laufzeit erhöhen, php session timeout erhöhen, php session dauer festlegen, session.gc_maxlifetime ändern, php session zeit einstellen, session.gc_maxlifetime, php session erhöhen, php script laufzeit erhöhen htaccess, sitzungsdauer php, php session laufzeit, session zeit einstellen php, php session gültigkeit erhöhen, php sessiondauer

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.