Start · Sprachen · PHP · Referenz · setrawcookie

setrawcookie

Funktion

Sendet einen HTTP-Cookie-Header, wobei der Wert <strong>nicht</strong> URL-kodiert wird – im Gegensatz zu <code>setcookie()</code>.

seit PHP 5.0.0 Kategorie: http

Signatur

setrawcookie(string $name, string $value = '', array|int $expires_or_options = 0, string $path = '', string $domain = '', bool $secure = false, bool $httponly = false): bool

Beschreibung

setrawcookie() verhält sich identisch zu setcookie(), kodiert den Cookie-Wert jedoch nicht mit urlencode(). Das bedeutet, der übergebene Wert wird 1:1 als Set-Cookie-Header gesendet. Dies ist nützlich, wenn der Wert bereits korrekt kodiert ist oder ein Format verwendet werden soll, das durch URL-Kodierung verändert werden würde (z. B. Base64url ohne Padding).

Wie alle Header-Funktionen muss setrawcookie() aufgerufen werden, bevor jegliche Ausgabe an den Browser gesendet wird. Ab PHP 5.2.0 ist der Parameter httponly verfügbar, ab PHP 7.3.0 wird als dritter Parameter alternativ ein assoziatives Array mit den Optionen expires, path, domain, secure, httponly und samesite akzeptiert.

Das Lesen des Cookies auf Serverseite erfolgt über $_COOKIE. Da kein automatisches URL-Decoding durch PHP stattfindet, muss der Wert bei Bedarf manuell dekodiert werden. Enthält der Wert ungültige Zeichen (z. B. Leerzeichen, Semikolon, Komma), führt dies zu einem fehlerhaften Cookie-Header.

Parameter

Name Typ Default Beschreibung
$name Pflicht string Der Name des Cookies. Darf keine Leerzeichen, Semikolons oder andere in HTTP-Headern unzulässige Zeichen enthalten.
$value string Der Wert des Cookies, der unverändert und ohne URL-Kodierung gesendet wird. Ein leerer String oder das Weglassen entfernt das Cookie beim Client (in Kombination mit einem in der Vergangenheit liegenden Ablaufzeitpunkt).
$expires_or_options array|int 0 Als int: Unix-Zeitstempel für den Ablaufzeitpunkt des Cookies (z. B. time() + 3600 für eine Stunde). Der Wert 0 bedeutet Session-Cookie (wird beim Schließen des Browsers gelöscht). Ab PHP 7.3.0 kann hier ein assoziatives Array mit den Schlüsseln expires, path, domain, secure, httponly und samesite übergeben werden.
$path string Der Pfad auf dem Server, für den das Cookie gilt. / macht das Cookie für die gesamte Domain verfügbar. Ein leerer String verwendet den aktuellen Pfad.
$domain string Die (Sub-)Domain, für die das Cookie gilt. .example.com macht das Cookie für alle Subdomains zugänglich.
$secure bool false Wenn true, wird das Cookie nur über HTTPS-Verbindungen gesendet. Empfohlen für alle sensiblen Cookies.
$httponly bool false Wenn true, ist das Cookie nicht über JavaScript (document.cookie) zugänglich. Schützt vor XSS-basierten Cookie-Diebstählen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Header erfolgreich in die Ausgabe-Warteschlange eingereiht wurde, false wenn bereits eine Ausgabe erfolgt ist oder ein anderer Fehler aufgetreten ist. Ein Rückgabewert von true garantiert nicht, dass das Cookie vom Browser akzeptiert wird.

Beispiele

Base64url-kodierter Wert als Cookie setzen

<?php
// Einen JWT-ähnlichen Wert (Base64url, kein URL-Encoding gewünscht) als Cookie senden
$payload = json_encode(['user_id' => 42, 'role' => 'admin']);
$base64url = rtrim(strtr(base64_encode($payload), '+/', '-_'), '=');

// setrawcookie verhindert, dass '-' oder '_' nochmals kodiert werden
setrawcookie(
    'auth_token',
    $base64url,
    time() + 3600,
    '/',
    '',
    true,   // Nur über HTTPS
    true    // Nicht per JavaScript zugreifbar
);

echo 'Cookie gesetzt: ' . $base64url;
Cookie gesetzt: eyJ1c2VyX2lkIjo0Miwicm9sZSI6ImFkbWluIn0

Cookie mit SameSite-Option (PHP 7.3+) setzen

<?php
// Modernes API mit Options-Array ab PHP 7.3
$wert = 'mein-rohwert+ohne/kodierung';

$ergebnis = setrawcookie('beispiel', $wert, [
    'expires'  => time() + 86400,
    'path'     => '/',
    'domain'   => '.example.com',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Strict',
]);

if ($ergebnis) {
    echo 'Cookie erfolgreich gesetzt.';
} else {
    echo 'Fehler: Ausgabe wurde bereits gesendet.';
}
Cookie erfolgreich gesetzt.

Cookie löschen (Ablaufzeitpunkt in der Vergangenheit)

<?php
// Cookie durch Setzen eines vergangenen Ablaufdatums löschen
setrawcookie('auth_token', '', time() - 3600, '/');
echo 'Cookie wird beim Client gelöscht.';
Cookie wird beim Client gelöscht.

// Wichtig · Fallstricke

Sicherheit: Da der Wert nicht URL-kodiert wird, muss sichergestellt werden, dass er ausschließlich gültige Zeichen enthält. Gemäß RFC 6265 sind nur druckbare ASCII-Zeichen außer Leerzeichen, Doppelpunkt, Semikolon und Komma erlaubt. Ungültige Zeichen können den gesamten Set-Cookie-Header beschädigen.

XSS-Schutz: Setze httponly auf true für alle Cookies, die nicht von JavaScript benötigt werden, um Session-Hijacking durch XSS-Angriffe zu erschweren.

Unterschied zu setcookie(): setcookie() kodiert den Wert automatisch mit urlencode() und dekodiert ihn beim Lesen aus $_COOKIE automatisch wieder. Bei setrawcookie() ist keine automatische De-/Kodierung vorhanden – Lesen und Schreiben muss konsistent manuell gehandhabt werden.

Ausgabe-Reihenfolge: Der Aufruf muss vor jeder HTML-Ausgabe, echo- oder print-Anweisung erfolgen. Output-Buffering mit ob_start() kann helfen, wenn dies nicht möglich ist.