Session-Cookies
Sabine
- php
Kann ich die Cookie-Lebensdauer eines Session-Cookies nur Serverseitig ändern?
hi,
Kann ich die Cookie-Lebensdauer eines Session-Cookies nur Serverseitig ändern?
wo denn sonst?
clientseitig? evtl. erlaubt es dir dein browser, auf solche eigenschaften eines cookies zuzugreifen, und sie zu ändern.
session cookies von PHP sind allerdings im allgemeinen auch das, was man clientseitig als session cookies bezeichnet - d.h., sie werden ganz ohne verfallsdatum gesetzt, und sind damit lediglich bis zum ende der browsersession gültig.
gruß,
wahsaga
Bei mir ist die Session nach etwa 20 Minuten beendet, obwohl ich den Browser noch geöffnet habe. Dachte das man die über ein Script auch verlängern kann.
Hi!
Bei mir ist die Session nach etwa 20 Minuten beendet, obwohl ich den Browser noch geöffnet habe. Dachte das man die über ein Script auch verlängern kann.
Du meinst nach 24 Minuten, oder ;-) Hierfür ist die Konfigurations-Option «session.gc_maxlifetime» verantwortlich, die standardmäßig den Wert 1440 besitzt und die Sekunden angibt, nach denen die Garbage Collection (= Müllentsorger) von PHP eine bestehende Session löschen _kann_.
Da für «session.gc_maxlifetime» PHP_INI_ALL gesetzt ist, kann diese Einstellung zur Laufzeit des Skriptes mit der Funktion ini_set() geändert werden.
Grüße,
Fabian St.
Kann ich das einfach vor die session_start() setzen. Sorry, habe damit noch nichts zu tun gehabt. Kannst mir ein kleines Hilfebeispiel geben.
Hi!
Kann ich das einfach vor die session_start() setzen. Sorry, habe damit noch nichts zu tun gehabt. Kannst mir ein kleines Hilfebeispiel geben.
wahsaga hat dir diese Frage bereits beantwortet und hat dir darüber hinaus noch eine weitere Möglichkeit aufgezeigt. Ein Beispiel für das Setzen im Skript würde z.B. so ausschauen:
ini_set('session.gc_maxlifetime', '3600'); // Session-Daten dürfen von der GC erst
// nach 3600s = 60min gelöscht werden
session_start();
// weiteres Skript
Was war daran jetzt so schwer, als dass man es nicht mit Hilfe von http://de2.php.net/manual/de/function.ini-set.php hätte lösen können?
Grüße,
Fabian St.
Hello,
ini_set('session.gc_maxlifetime', '3600'); // Session-Daten dürfen von der GC erst
// nach 3600s = 60min gelöscht werden
session_start();
Das hilft nur, wenn sie einen eigenen session.save_path hat!
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
Da für «session.gc_maxlifetime» PHP_INI_ALL gesetzt ist, kann diese Einstellung zur Laufzeit des Skriptes mit der Funktion ini_set() geändert werden.
Ich setze mal voraus, dass Session.save_path auf /tmp steht:
Das bleibt aber trotzdem unsinnig, da andere Scripte (anderer Virt Hosts) nichts von dieser 'lokalen' Änderung wissen und den GC trotzdem mit dem Standardwert (oder ihrem eigenen) aufrufen. Wenn also in einem System von mehreren VirtHosts _einer_ seinen Wert auf 1 Sekunde eingetellt hat, dann werden bei jedem Zugriff innerhalb seines VirtHosts _alle_ Sessiondatein aller User gelöscht, die älter als 1 Sekunde sind.
Man sollte also seine eigenen Sessions mittels session.save_path dringend in den eigenen Dateibereich verlegen und notfalls mit .ht_ beginnen.
Ein vernünftiger Provider bereitet das aber für jeden Account so vor. Es gibt aber noch viele, die auf der Standardeinstellung "out of the box" rumreiten.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
hi,
Bei mir ist die Session nach etwa 20 Minuten beendet, obwohl ich den Browser noch geöffnet habe.
das liegt an session.gc_maxlifetime.
Dachte das man die über ein Script auch verlängern kann.
setze den wert herauf, wenn dir danach ist.
bspw. per ini_set() vor dem starten der session, oder auch allgemein per .htaccess, sofern möglich.
gruß,
wahsaga
Hello,
da geschieht folgendes:
PHP hat einen eingebauten "Müllbeseitiger" für abgelaufene Sessiondateien. Das Ding nennt sich GC (Garbage Controller) und wird im Prinzip bei jedem Ansprechen des Runtime-Systems auch gestartet. Damit nun nicht zu oft aufgeräumt wird, gibt es eine Wahrscheinlichkeit (session.gc_probability) und einen Teiler (session.gc_divisor), die das Anspringen regeln.
Die Sessiondatei wird dann beim Aufräumlauf gelöscht, wenn session.gc_maxlifetime abgelaufen ist. Die Konfigurations-Variable müsste eigentlich "session.gc_minlifetime" heißen, weil vor Ablauf dieser Zeit keine Löschung stattfindet. Der GC prüft dabei nicht, ob die Sessiondatei noch benötigt wird. Er stellt nur fest, ob die Datei innerhalb der "minlifetime" angefasst wurde. Das funktioniert bei Linux schon immer und bei Windows-Hosts erst seit einer neueren PHP-Version. Da musst Du mal nachlesen...
Im Prinzip basiert die "Sicherheit" bei der Session nur auf Obscurity, denn man hat nur einen einzigen Schlüssel. Nimmt man die Zeit hinzu, um die Gültigkeit dieses Schlüssels kurz zu halten, dann vermindert man damit die Trefferwahrscheinlichkeit, eine gültige Session zu finden.
Man sollte also immer drüber nachdenken, ob man nicht zwei Schlüssel vergibt, die gegeneinander verriegelt sind. Erfolgt eine Anfrage untger dem einen Schlüssel (der gerade vergeben ist), ohne dass der andere dazu passt, werden beide Schlüssel deaktiviert und der Fehlversuch im Datensatz des zugehörigen Users registriert.
Wenn Du nicht willst, dass die Sessiondateien gelöscht werden, dann verlege sie in ein Verzeichnis, (mit session.save_path() vor dem Sessionstart), dass Du für das PHP-Runtime gegen Browsen schützt, also das R-Reccht auf das _Verzeichnis_ wegnimmst. Das quittiert der GC damit, dass er gar keine Sessions mehr bereinigt.
Wenn Du nun im Userdatensatz immer die aktive Session einträgst, kannst Du diese beim nächsten Login beseitigen und dann die neue aktive eintragen. Außerdem kannst Du in der Sessiondatei selbst dafür sorgen, dass die Gültigkeit des Schlüssels nicht endlos wird.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
setze den wert herauf, wenn dir danach ist.
bspw. per ini_set() vor dem starten der session, oder auch allgemein per .htaccess, sofern möglich.
Das ist witzlos, da diese Einstellung systemweit gilt, und andere Projekte bzw. andere User davon auch betroffen wären. Bei jedem Zugriff auf PHP (egal von welcher Domain eines Hosts) wird der GC gestartet bzw. gewürfelt, ob er gestartet werden soll.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
hi,
Das ist witzlos, da diese Einstellung systemweit gilt, und andere Projekte bzw. andere User davon auch betroffen wären. Bei jedem Zugriff auf PHP (egal von welcher Domain eines Hosts) wird der GC gestartet bzw. gewürfelt, ob er gestartet werden soll.
ja und?
deshalb kann er ja trotzdem zuerst mal überprüfen, ob die session-dateien nach dem lokal gültigen wert für session.gc-maxlifetime bereits als müll zu betrachten ist oder nicht.
oder hast du einen beleg dafür, dass er das nicht machen würde?
gruß,
wahsaga
Hello,
ja und?
deshalb kann er ja trotzdem zuerst mal überprüfen, ob die session-dateien nach dem lokal gültigen wert für session.gc-maxlifetime bereits als müll zu betrachten ist oder nicht.
Es gibt keinen sinnvollen lokal gültigen Wert.
Wenn nämlich ein anderer User einer anderen Domain dann denselben PHP-Deamon bemüht, was in einem Multi-Hosting-System die regel ist, dann würde der 'seinen' Wert benutzen. Und wenn der kürzer ist, dann nützt das 'lokale' Raufsetzen überhaupt nichts.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom