Dennis: Session wenn kein Cookie, dann auch keine Session

Beitrag lesen

Hi Mike,

User hat Cookies im Browser abgestellt. Wenn PHP nun die Option bietet durch "session.use_only_cookies" heisst das für mich soviel wie, wenn der User keine Cookies akzeptiert, hat er Pech gehabt. Dann wird auch keine Session Datei angelegt, bzw. wenn angelegt dann auch wieder sofort gelöscht.

Und genau diese Annahme ist falsch. Du hast auf dem Server keine Möglichkeit festzustellen, ob ein Browser Cookies aktzeptiert oder nicht, zumindest nicht innerhalb eines Requests. Die einzige Möglichkeit festzustellen ob ein Browser Cookies aktzeptiert, ist, ihm ein Cookie zu geben und dann beim *nächsten* Request zu gucken, ob das Cookie vom Browser wieder mit an den Server gesendet wurde.

Mach dir bitte bewusst, wie session_start() funktioniert, vereinfacht gesagt, macht diese Funktion folgendes:

if (isset($_COOKIE[session_name()])) {
    $id = $_COOKIE[session_name()];
  }
  else if (session.use_only_cookies deaktiviert && isset($_GET[session_name()])) {
    $id = $_GET[session_name()];
  }
  else {
    $id = Neue zufällige ID erzeugen
    setcookie(session_name(), $id, ...);
  }
  $file = session.save_path . $id
  Datei $file öffnen, falls nicht existent, vorher anlegen

Wie gesagt, das ist jetzt sehr vereinfacht dargestellt. In Wirklichkeit kommen werden da im PHP-Sourcecode natürlich noch etliche Sicherheitsprüfungen etc. vorhanden sein.

Worauf ich aber hinaus will: Beim Aufruf von session_start() wird *in jedem Fall* eine Session-Datei geöffnet. Und wenn keine bereits vorhandene Session-Datei verwendet werden kann, weil auf keinem Wege eine Session-ID übermittelt wurde, dann wird eben nun mal eine neue Session-Datei angelegt.

Stattdessen erhalte ich mit jedem Aufruf eine neue Datei. Das halte ich für Fatal, denn ich könnte dieses Verhalten ausnutzen indem ich Millionen von Session Dateien in den TMP Ordner produzieren lassen könnte, und das bevor der GC greift.

Wie gesagt: Die Unterstützung von Cookies kannst du nur über zwei Requests hinweg feststellen, dafür muss PHP zwangsläufig eine Session-Datei anlegen, anders funktioniert es nicht.

Das müsste sich doch extrem negativ auf den Server auswirken, oder sehe ich das falsch?

Das glaube ich nicht. Es werden ja erst mal nur Session-Dateien angelegt, die sind erst mal leer (sofern du da nicht direkt irgendwelche riesigen Mengen an Daten reinspeicherst) und belegen somit nicht sonderlich viel Festplattenkapazität. Somit glaube ich kaum, dass dir jemand die komplette Festplatte vollgestopft und dein System dadurch zum Absturz bringt.

Durchaus problematischer ist es, wenn PHP alle Session-Dateien in einen Ordner ablegt. Dann wird das einlesen dieses Ordners nämlich mit der Zeit immer langsamer, weil ein Scan des Ordners über entsprechend mehr Dateien laufen muss. Dafür gibt es aber die Möglichkeit session.save_path so zu konfigurieren, dass PHP noch über Unterordner arbeitet, also die Session abcdefgh in der Datei /tmp/a/b/c/sess_abcdefgh ablegt.

Viele Grüße,
  ~ Dennis.