W3docs

PHP Sessions: Ein umfassender Leitfaden

Erfahren Sie, wie PHP-Sessions funktionieren, wie Sie Session-Daten speichern und abrufen und Sessions gegen Fixierungs- und Hijacking-Angriffe absichern.

HTTP ist zustandslos — jede Anfrage eines Browsers ist unabhängig, und der Server vergisst alles, sobald er eine Antwort sendet. Sessions sind der Weg, auf dem PHP einen Besucher zwischen Anfragen speichert: Sie ermöglichen es, einen Benutzer angemeldet zu halten, einen Warenkorb aufzubauen oder Einstellungen zu merken, während der Benutzer von Seite zu Seite navigiert. Dieser Leitfaden erklärt, was Sessions sind, wie sie intern funktionieren, wie man Session-Daten liest und schreibt und wie man sie absichert.

Was sind PHP-Sessions?

Eine PHP-Session ist ein Mechanismus zum Speichern benutzerspezifischer Daten auf der Serverseite für die Dauer eines Besuchs. Anders als Cookies, die Daten im Browser speichern, hält eine Session die eigentlichen Daten auf dem Server und sendet dem Browser nur eine kleine Session-ID, um zu identifizieren, welche Daten zu wem gehören.

Das ist aus zwei Gründen wichtig:

  • Kapazität — Cookies sind auf etwa 4 KB begrenzt und leben im Browser; Session-Daten liegen im Server-Speicher (Dateien, eine Datenbank oder Arbeitsspeicher) und können wesentlich größer sein.
  • Sicherheit — sensible Werte (eine Benutzer-ID, Rolle oder Warenkorbinhalt) verlassen den Server nie, sodass der Browser sie weder lesen noch manipulieren kann. Nur die undurchsichtige Session-ID wird preisgegeben.

Wie funktionieren PHP-Sessions?

Wenn eine Session startet, generiert PHP eine eindeutige Session-ID für den Besucher und sendet sie dem Browser in einem Cookie namens PHPSESSID. Bei jeder weiteren Anfrage gibt der Browser dieses Cookie zurück, und PHP nutzt die ID, um die zugehörigen Daten auf dem Server nachzuschlagen. Die Daten selbst sind in Ihrem Code als $_SESSION-Array verfügbar.

Session-Ablauf

graph LR
A[Browser] -- 1. Request + Session Cookie --> B[Server]
B -- 2. Validate Cookie & Fetch Data --> A
A -- 3. Receive Response --> B

Kurz gesagt: Das Cookie trägt die ID; der Server hält die Daten.

Eine Session starten

Jede Seite, die Session-Daten liest oder schreibt, muss session_start() aufrufen, bevor irgendeine Ausgabe an den Browser gesendet wird. Da session_start() das PHPSESSID-Cookie über einen HTTP-Header sendet, löst selbst ein einzelnes Leerzeichen oder eine Leerzeile vor dem öffnenden <?php-Tag eine Warnung „headers already sent" aus und bricht die Session.

Der Aufruf von session_start() setzt entweder die bestehende Session des Besuchers fort (wenn der Browser eine gültige ID gesendet hat) oder startet eine neue. Die Absicherung des Aufrufs mit session_status() verhindert einen Hinweis, wenn die Session bereits früher in der Anfrage gestartet wurde:

So starten Sie eine PHP-Session

<?php
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

Session-Daten lesen und schreiben

Sobald eine Session gestartet ist, verhält sich die superglobale Variable $_SESSION wie jedes andere assoziative Array. Weisen Sie einem Schlüssel einen Wert zu, um ihn zu speichern:

Daten in einer PHP-Session speichern

<?php
$_SESSION['username'] = 'John Doe';
$_SESSION['cart'] = ['book', 'pen'];

Lesen Sie die Daten auf derselben Seite oder bei jeder späteren Anfrage in derselben Session wieder aus:

Daten aus einer PHP-Session abrufen

<?php
// Always check the key exists to avoid a warning
$username = $_SESSION['username'] ?? 'Guest';

echo "Welcome, {$username}";

Da die Daten über Anfragen hinweg erhalten bleiben, ist ein gängiges Muster ein Seitenaufruf-Zähler, der Seitenneuladen übersteht:

Seitenaufrufe in der aktuellen Session zählen

<?php
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

$_SESSION['views'] = ($_SESSION['views'] ?? 0) + 1;

echo "You have viewed this page {$_SESSION['views']} time(s).";

Um einen einzelnen Wert zu entfernen, verwenden Sie unset() auf dessen Schlüssel — weisen Sie nicht null zu, da der Schlüssel dadurch erhalten bleibt:

<?php
unset($_SESSION['cart']);

Sessions vs. Cookies

Sessions und Cookies arbeiten oft zusammen, speichern Daten jedoch an unterschiedlichen Orten. Greifen Sie auf eine Session zurück, wenn die Daten sensibel oder umfangreich sind; greifen Sie auf ein Cookie zurück, wenn der Browser selbst sich etwas über Besuche hinweg merken muss (wie ein „Angemeldet bleiben"-Token).

SessionCookie
Gespeichert aufServerBrowser
Für Benutzer sichtbarNein (nur die ID)Ja
GrößenbeschränkungGroß (Server-Speicher)~4 KB
LebensdauerBis der Browser geschlossen wird oder TimeoutKonfigurierbares Ablaufdatum

PHP-Sessions absichern

Es ist wichtig, PHP-Sessions abzusichern, um unbefugten Zugriff auf sensible Benutzerdaten zu verhindern. Sie können Ihre PHP-Sessions auf verschiedene Weisen absichern:

  • Die Session-ID regelmäßig erneuern.
  • Die Session-Daten serverseitig in einem sicheren Verzeichnis speichern.
  • HTTPS verwenden, um die Übertragung von Session-Daten zu schützen.

Die Session-ID erneuern und das Cookie absichern

Die Härtungsoptionen müssen vor session_start() gesetzt werden, da das Cookie sonst bereits mit den alten Einstellungen gesendet wurde. Die ID unmittelbar nach einer Rechteänderung (z. B. einem Login) zu erneuern, verhindert Session-Fixierungs-Angriffe, bei denen ein Angreifer ein Opfer dazu bringt, eine Session-ID zu verwenden, die der Angreifer bereits kennt:

<?php
// Configure before the session starts
ini_set('session.cookie_secure', '1');   // send cookie over HTTPS only
ini_set('session.use_only_cookies', '1'); // never accept the ID from the URL
ini_set('session.cookie_httponly', '1');  // hide the cookie from JavaScript

session_start();

// After a successful login, swap the ID and discard the old one
session_regenerate_id(true);
EinstellungWas sie verhindert
cookie_secureSession-ID leckt über unverschlüsseltes HTTP
cookie_httponlyJavaScript (XSS) stiehlt das Cookie
use_only_cookiesSession-IDs werden in URLs übergeben
session_regenerate_idSession-Fixierung nach einem Login

Eine PHP-Session beenden

Um einen Benutzer abzumelden, löschen Sie die Daten und zerstören Sie die Session. Das Leeren von $_SESSION entfernt die Variablen; session_destroy() verwirft die Daten auf dem Server; und das Löschen des Cookies verhindert, dass der Browser die veraltete ID weitersendet:

<?php
session_start();

// 1. Clear all session variables
$_SESSION = [];

// 2. Delete the session cookie in the browser
if (ini_get('session.use_cookies')) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
}

// 3. Destroy the data stored on the server
session_destroy();

Fazit

Zusammenfassend lässt sich sagen, dass PHP-Sessions ein unverzichtbares Werkzeug zum Speichern von Benutzerdaten auf der Serverseite und zur Verbesserung der Benutzererfahrung auf Ihrer Website sind. Wenn Sie verstehen, wie sie funktionieren und wie man sie einsetzt, können Sie alle Vorteile nutzen, die sie bieten. Mit geeigneten Sicherheitsmaßnahmen können Sie zudem sicherstellen, dass sensible Benutzerdaten geschützt sind.

Übungen

Übung
Was kann mit PHP-Sessions erreicht werden?
Was kann mit PHP-Sessions erreicht werden?
Was this page helpful?