PHP session zeit zu kurz

raven16

Lieutenant
Registriert
Nov. 2008
Beiträge
580
Hi,

ich möchte eine längere loginzeit erreichen als die vom host festgelegte sessionzeit in der php.ini

hab woanders gelesen, dass man mit der funktion session_regenerate_id() eine neue session erzeugt wird.

wenn ich also will, dass die user länger als 1440 sekunden eingeloggt sind, dann muss ich die id bei seitenaufruf erneuern.
weil ich habe/hatte das problem, dass wenn man beiträge beantwortet und längere zeit nicht mehr die seite aktualisiert hat, dass man von funpic damals rausgeschmissen wurde und sich neu einloggen musste und das formular nicht mehr abschicken konnte weil man dazu einen gültigen login braucht.
bin jetzt bei nem anderen anbieter aber bevor ich mich damit rumärgere, wollte ich wissen ob man das umgehen kann damit ich das frühzeitig danach strukturieren kann

aber irgendwie versteh ich die theorie dahinter noch nicht ganz
wenn ich die session_id bei jedem neuen Seitenaufruf erneuern lasse und in die Datenbank eintrage bis zum logout, dann verfällt doch einfach die session auch nach 1440 sekunden, wenn man keinen seitenaufruf macht wo der befehl steht das der die id mit regenerate erneuern soll?!

vllt. hat jemand nen beispiel oder kann mir erklären wie ich am besten die festgelegte session.gc_maxlifetime aus der php.ini überlisten kann?

ist das überhaupt sinnvoll, die session_id() zu dem zugehörigen benutzer in die datenbank zu schreiben oder reicht nicht einfach ein einfaches session_destroy wenn die zeit abgelaufen ist so wie ich das vorher hatte... ich steig da einfach nicht mehr so genau durch

vllt. kann mir jemand auch die beste variante erzählen, wie man ein login aufbauen sollte... jetzt nur über sessions oder auch datenbank verbunden?

hab jetzt logins immer nur nach tutorials programmiert
 
KA ob das klappt, aber probier mal folgendes vor dem "session_start" Befehl einzubauen:
Code:
 ini_set('session.gc_maxlifetime', 10000);
 
Hey,
die session wird automatisch mit jedem seitenaufruf verlängert (um die zeit der max. lifetime; vorraussetzung ist natürlich ein "session_start();"), die generierung einer neuen session-id kannste dir sparen.
ich würd das ganze über nen cookie lösen - wenn ein entsprechender cookie gesetzt ist (der auch eine lifetime haben kann), dann wird man automatisch wieder eingeloggt.

Grüße,
RbusT
 
cx01 schrieb:
KA ob das klappt, aber probier mal folgendes vor dem "session_start" Befehl einzubauen:
Code:
 ini_set('session.gc_maxlifetime', 10000);

Und woher kann ich sehen, ob das geklappt hat? Wenn der keine Fehlermeldung ausspuckt?
Hab die Fehlermeldung
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent
Liegt das vllt. daran, dass ich das nur einmal ändern kann und die funktion schon beim login eingefügt hab oder kann ich das vor jedem session_start() schreiben?
Ergänzung ()

Könnte ich z.B. auch, wenn das mit der Verlängerung der Zeit in der ini.php nicht klappt die sessionid auf seiten, die länger geöffnet bleiben und wo die session zeit nicht ausreicht die session_id mit in die adressleiste packen und beim absenden des formulars auf der seite wird dann die session_id aus der adressleiste mit der aus der datenbank verglichen und wenn die nicht gleich sind, dann logge ich den user aus und er kann dann das formular nicht abschicken
 
Zuletzt bearbeitet:
raven16 schrieb:
Und woher kann ich sehen, ob das geklappt hat? Wenn der keine Fehlermeldung ausspuckt?
Hab die Fehlermeldung
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent
Ich kenn mich leider mit PHP nicht wirklich aus; hatte das nur so im Internet gefunden. Die Fehlermeldung klingt so, als müsstest du es an den Anfang der PHP Datei packen, noch bevor du irgendwelchen Output erzeugst.

Falls das alles nicht hilft, kannst du dein eigenes Session-Handling schreiben, also die vorgegebenen Funktionen session_start, etc. einfach umgehen.
Du musst, nachdem der Nutzer sich erfolgreich eingeloggt hat, eine eindeutige Session ID erzeugen und diese dann auf dem Client(als Cookie) und auf dem Server(entweder in einer DB oder als Datei) speichern. Und dann eben bei jedem Zugriff prüfen, ob die ID im Cookie und in der DB übereinstimmt.
Hier musst du dann aber aufpassen, dass du keine Sicherheitslücken einbaust.
 
Hab den Login soweit erst mal ohne Fehler zum laufen bekommen :)

Die Sicherheitslücken im Login hab ich soweit wie ich konnte entfernt mit
mysql_real_escape_string() bei strings, also alles was auch buchstaben/zeichen hat
intval() für zahlen

und das immer dann, wenn ich variablen in eine mysql_anfrage einbaue.

Ist das soweit richtig oder gibts da noch mehr, was man unbedingt tun muss?

das session_start() habe ich durch eine include-datei direkt am anfang der Seite eingebaut, sodass kein output vorher gemacht wird und nen fehler auftaucht

ich habe außerdem usersession,username,userid,name und vorname in $_SESSION[] Variablen gesteckt und die usersession beim einloggen in die datenbank eingetragen

beim ausloggen lösche ich die session mit session_destroy()

Wenn ich irgendwann die funktion login merken einbaue, dann muss ich das ja in nem cookie die usersession speichern, um sie mit der datenbank zu vergleichen um den user automatisch wieder einzuloggen...

hab zwar noch nie nen cookie geschrieben aber probier ich irgendwann mal xD
Ergänzung ()

Und der Vorschlag, die session.gc_maxlifetime zu manipulieren, klappt leider nicht :(
hab getestet, die zeit auf 5 sekunden zu setzen
ini_set('session.gc_maxlifetime', 5);

war aber dann nach >5 Sekunden immernoch eingeloggt.

Ist halt nen kostenloser Server,
passe das dann notfalls an wenn ich meine Seite auf nen kostenpflichtigen Server verschiebe
 
Zuletzt bearbeitet:
Ich meinte ja, dass du session_start und session_destory garnicht benutzen brauchst. Denn diese Funktionen machen nichts anderes, als ich oben beschrieben habe (Cookie beim User anlegen und Eintrag in DB bzw. Datei anlegen). Wenn du das selbst implementierst, kannst du frei entscheiden, ab wann du alte Sessions löschst.
Da du jedoch auf nen vernünftigen Server wechseln willst, macht es wohl keinen Sinn hier dein eigenes Session-Handling zu bauen.
 
Du solltest session_regenerate_id() bei jedem Aufruf nutzen, da dies eine potentielle Angriffslücke schließt (Session Fixiation / Hijacking). ;)
 
Zurück
Oben