Kodokon kodokon.com

Sessions und Cookies: Login und Warenkorb

Erinnere dich von Seite zu Seite an deine Besucher: sicherer Login, ein Warenkorb in der Session und richtig geschützte Cookies.

10 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

HTTP merkt sich nichts: Jede Anfrage kommt frisch an, ohne Verbindung zur vorherigen. Sessions lösen dieses Problem: session_start() verknüpft den Besucher mit einer eindeutigen Kennung, die in einem Cookie übertragen wird, und mit einem Speicherbereich auf der Serverseite, der über $_SESSION zugänglich ist. Rufe session_start() ganz oben auf jeder betroffenen Seite auf, vor jeder Ausgabe.

PHP
<?php

declare(strict_types=1);

session_start();

$storedHash = password_hash('secret123', PASSWORD_DEFAULT);
$password = $_POST['password'] ?? '';

if (password_verify($password, $storedHash)) {
    session_regenerate_id(true);
    $_SESSION['user_id'] = 42;
    header('Location: /account.php');
    exit;
}

echo "Invalid credentials.";
login.php: in Wirklichkeit stammt der Hash aus deiner Datenbank.

Eine Seite zu schützen läuft darauf hinaus, die Anwesenheit des Nutzers in der Session zu prüfen und andernfalls weiterzuleiten. Die Session dient außerdem als idealer temporärer Speicher für einen Warenkorb: Ein assoziatives Array Produkt-ID => Menge überlebt von Seite zu Seite.

PHP
<?php

declare(strict_types=1);

session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: /login.php');
    exit;
}

$_SESSION['cart'] ??= [];

$productId = filter_input(
    INPUT_POST,
    'product_id',
    FILTER_VALIDATE_INT
);

if (is_int($productId)) {
    $qty = $_SESSION['cart'][$productId] ?? 0;
    $_SESSION['cart'][$productId] = $qty + 1;
}

$count = array_sum($_SESSION['cart']);
echo "Cart: " . $count . " item(s)";
cart.php: eine geschützte Seite und ein in der Session gespeicherter Warenkorb.

Cookies dagegen leben auf dem Gerät des Nutzers und überleben das Schließen des Browsers: perfekt für ein Theme oder eine Spracheinstellung. Seit PHP 7.3 nimmt setcookie() ein Array von Optionen entgegen: Verlange secure (nur HTTPS), httponly (für JavaScript unsichtbar) und samesite (begrenzt das Senden von anderen Websites aus).

PHP
<?php

setcookie('theme', 'dark', [
    'expires' => time() + 60 * 60 * 24 * 30,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

$theme = $_COOKIE['theme'] ?? 'light';
echo "Active theme: " . $theme;
Ein Einstellungs-Cookie mit dreißig Tagen Gültigkeit und den richtigen Flags.

Das Abmelden muss genauso sorgfältig ablaufen wie das Anmelden: $_SESSION leeren, die Session auf der Serverseite zerstören und das Cookie ablaufen lassen, das die Kennung transportiert hat.

PHP
<?php

session_start();

$_SESSION = [];
session_destroy();

setcookie(session_name(), '', time() - 3600, '/');

header('Location: /login.php');
exit;
logout.php: eine vollständige Abmeldung, die keine Spur hinterlässt.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Wo werden die Daten einer PHP-Session gespeichert?
    • In einem Cookie auf dem Gerät des Nutzers
    • Auf dem Server; der Browser behält nur eine Kennung in einem Cookie
    • In der URL jeder Seite
    • Im localStorage des Browsers
  2. Warum sollte man session_regenerate_id(true) direkt nach einem erfolgreichen Login aufrufen?
    • Um Session-Fixation zu verhindern: Eine vor dem Login bekannte Kennung wird unbrauchbar
    • Um die Lebensdauer des Session-Cookies zu verlängern
    • Um die alten Warenkorb-Daten zu löschen
  3. Was bewirkt die Option httponly eines Cookies?
    • Sie verschlüsselt den Inhalt des Cookies
    • Sie beschränkt das Cookie auf unsichere Verbindungen
    • Sie macht das Cookie für das JavaScript der Seite unzugänglich, was Diebstahl über XSS eindämmt