Signatur
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
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 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 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.';
// 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.