PHP Session Cookie Zeit
PHP_Frage
- php
Hallo, ich weiss wie man eine Session startet, um Cookies im Server zu speichern. Sie muss ja am Anfang der index.php Datei stehen.
Schaut so aus:
<? session_start(); ?>
<html>...</html>
Ein serverseitigen Cookie setze ich ja so: $_SESSION["1"] = 1; .
Wie lange bleibt so ein Cookie im Server? Ist diese Zeit beliebig einstellbar? Ich habe mal gelesen irgendetwas mit 30 Minuten.
Wie lange bleibt so ein Cookie im Server? Ist diese Zeit beliebig einstellbar? Ich habe mal gelesen irgendetwas mit 30 Minuten.
Deine Fragen beantwortet:
http://php.net/manual/de/session.configuration.php
Fred
Hello,
Hallo, ich weiss wie man eine Session startet, um Cookies im Server zu speichern. Sie muss ja am Anfang der index.php Datei stehen.
Schaut so aus:
<? session_start(); ?>
<html>...</html>
Das session_start() muss nicht am Anfang des Scriptes stehen, sondern nur, bevor eine Ausgabe veranlasst wird.
Der Cookie für die Session wird in die Headerliste für die Response-Header eingetragen. Wenn nun eine Ausgabe erfolgt, werden zuerst die Header abgearbeitet und gesendet, denn "Kopfdaten" müssen naturgemäß auch im Kopf eines Datenstromes (einer Datei) stehen.
Erst anschließend kommt die Nutzlast (Payload) der Übertragung an die Reihe.
Ein serverseitigen Cookie setze ich ja so: $_SESSION["1"] = 1; .
Serverseitig kann man eigentlich gar keine Cookies "setzen", sondern sich diese bestenfalls merken bzw. diese für die Response-Header vormerken, damit sie dem Client bei der Antwort mitgesandt werden.
Der Client weiß selber, wer er ist. Er speichert den Cookie daher im jeweiligen Nutzerbereich des mehruserfähigen Programmes (Browser) und kann so über die Benutzeranmeldung beim Client und die aufgerufene Domain (oder auch URL) den Cookie wieder zuorden beim Request.
Der Server empfängt diesen mit dem Request-Header und PHP separiert die Cookies in $_COOKIE.
Dort bleiben sie genau für einen Request, also den jeweiligen Scruptaufruf, gespeichert. Mit dem Ende des Scriptes "vergisst" der Server die Daten in $_COOKIE, $_POST und $_GET wieder.
Um sich Daten auf dem Server über einen Request hinaus zuordnungsfähig speichern zu können, verwendet man z.B. den Sessionmechanismus. In einem persistenten Speicher (Datei) werden i.d.R. bei Beendigung des Scriptes die gewünschten Daten gespeichert. Während der Scriptlaufzeit kann man sie in das Array $_SESSION eintragen. Genau dieses Array wird beim PHP-Sessionmechanismus am Ende der Scriptlaufzeit (auf Wunsch auch zwischendurch) in die Datei geschrieben.
Wenn nun der Client einen Cookie mitsendet, dessen Name zur PHP-Einstellung für Cookies passt, und im Script eine Session gestartet wird, dann lädt PHP die zum Cookie passende Datei wieder in das Array $_SESSION.
Erst dann stehen die beim letzten Durchlauf gespeicherten Daten wieder zur Verfügung.
Wie lange bleibt so ein Cookie im Server? Ist diese Zeit beliebig einstellbar? Ich habe mal gelesen irgendetwas mit 30 Minuten.
Diese Daten bleiben in der Sessiondatei solange erhalten, wie diese erhalten bleibt und niemand die Daten einzeln oder komplett überschrieben hat.
Die Voreinstellung von PHP out-of-the-Box ist dafür eine Mindestdauer 1440 Sekunden, entsprechend 24 Minuten [1]. Wenn die Sessiondatei diese 24 Minuten lang nicht angefasst (gelesen oder beschrieben) wurde, wird sie üblicherweise vom Garbage-Collector (dem Müllsammler) beseitigt. Der kann sich damit aber solange Zeit lassen, wie er will [2]. Die Datei kann also auch noch nach 10 Tagen auf der Platte sein...
Es gibt aber auch Systeme, bei denen die "Müllentfernung" an einem Cron-Job hängt, der dann im Höchstfalle alle 1 Minute (typisch alle 4-5 Minuten) läuft. Die Daten könnten dann also zwischen 24 und 29 Minuten zur Verfügung bleiben.
Generell ist zu sagen, dass der PHP-Sessionmechanismus nur eine rudimentäre Basis bildet für ein Sessionmanagement. Den eigentlichen Mechanismus sollte man für eine bessere Umsetzung selber mittels einer (oder mehrerer) Tabelle(n) in einer Datenbank umsetzen. Das ermöglicht dann auch individuelle Sessionlaufzeiten pro User, die Kontrolle "wer ist online?", also die Abfrage, wer innerhalb der letzten Minute, der letzten fünf Minuten, der letzten Stunde (,...) einen authentifierten Request ausgelöst hat.
Außerdem ermöglicht einem so ein System dann auch, einzelne User auszusperren, usw.
Die Offenzeit der Basisschicht muss dabei aber immer länger sein, als die der Implementation mittels Datenbank. Aber man könnte trotzdem mit jedem Request die Sessionkennung ändern
http://de.php.net/manual/en/function.session-regenerate-id.php
was dann die Sicherheit des Systems steigern helfen kann.
Je länger die Offenzeit einer Session _mit_derselben__Kennung_, desto leichter wird die Angreifbarkeit des betroffnenen Users.
[1] Ich habe schon öfter darüber nachgedacht, ob es wohl mal 1440 Minuten gewesen sein könnten? Dann würde dies einem ganzen Tag entsprechen.
[2] Das in einem Satz zu erklären, wäre übertrieben. Lies dazu bitte selber mal unter dem Stichwort im Handbuch und in Google.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Tach!
Hallo, ich weiss wie man eine Session startet, um Cookies im Server zu speichern.
Beides hat nicht direkt etwas miteinander zu tun. Cookies brauchen keine Session. Eine Session kann mit Cookies arbeiten, muss das aber nicht. Die Session-ID kann auch als URL-Parameter zwischen Server und Client hin- und hergereicht werden. Mehr als die Session-ID braucht ein Client nicht, damit der Server die Session und die darin gespeicherten Daten wieder aufnehmen kann.
Ein serverseitigen Cookie setze ich ja so: $_SESSION["1"] = 1; .
setcookie(), wenn du nur Cookies ohne Session meinst.
Wie lange bleibt so ein Cookie im Server? Ist diese Zeit beliebig einstellbar?
Das steht auf der Handbuchseite der erwähnten Funktion. Wenn du allerdings Session-ID-Cookies meinst, dafür hast du ja schon eine Antwort bekommen.
dedlfix.