Cookie-Sicherheit für WordPress konfigurieren

Schritt-für-Schritt-Anleitung: Secure, HttpOnly und SameSite für WordPress-Cookies einrichten — mit functions.php, wp-config.php, WooCommerce-Hinweisen und fertigen Code-Snippets zum Kopieren.

WordPress · Schritt für Schritt

Sichere Cookies auf WordPress

WordPress setzt beim Login mehrere eigene Cookies: wordpress_logged_in_[hash], wordpress_sec_[hash] und weitere. Diese müssen explizit mit Secure, HttpOnly und SameSite abgesichert werden — WordPress tut das nicht automatisch vollständig.

Diese Anleitung zeigt den empfohlenen Code-Ansatz in vier Schritten: Session-Flags in der functions.php setzen, FORCE_SSL_ADMIN in der wp-config.php aktivieren, SameSite für alle WP-Cookies nachrüsten und die Konfiguration verifizieren. WooCommerce-spezifische Hinweise sind integriert. Der Wolf-Agents Web Security Check prüft Cookie-Flags automatisch — als Teil der 166 Prüfpunkte.

1 Schritt 1 von 4

functions.php — Session-Cookie-Flags und WP-Filter

In der functions.php Ihres Child-Themes (oder eines Site-Specific Plugins) setzen Sie PHP-Session-Flags mit ini_set und hängen sich mit dem wp_headers-Filter in den WordPress-Cookie-Mechanismus ein. So werden alle Cookies — inklusive der WordPress-Auth-Cookies — automatisch mit SameSite gesichert.

functions.php (Child-Theme) wp_headers Filter
// functions.php (Child-Theme oder Site-Specific Plugin)

// 1. Session-Cookie-Einstellungen absichern
@ini_set('session.cookie_secure', 1);
@ini_set('session.cookie_httponly', 1);
@ini_set('session.cookie_samesite', 'Strict');

// 2. WordPress Auth-Cookies nur über HTTPS setzen
function secure_logged_in_cookie($secure, $force) {
    return is_ssl();
}
add_filter('secure_logged_in_cookie', 'secure_logged_in_cookie', 10, 2);

// 3. SameSite für alle WordPress-Cookies nachrüsten (ab WP 5.2)
function add_samesite_to_cookies($headers) {
    if (isset($headers['Set-Cookie'])) {
        $cookies = (array) $headers['Set-Cookie'];
        foreach ($cookies as &$cookie) {
            if (stripos($cookie, 'SameSite') === false) {
                $cookie .= '; SameSite=Strict';
            }
        }
        $headers['Set-Cookie'] = $cookies;
    }
    return $headers;
}
add_filter('wp_headers', 'add_samesite_to_cookies');
Niemals im Parent-Theme bearbeiten. Änderungen in der functions.php des Parent-Themes werden bei Theme-Updates überschrieben. Tragen Sie den Code in Ihr Child-Theme oder ein eigenes Site-Specific Plugin ein.
WooCommerce-Shops: SameSite=Lax verwenden

Wenn Sie WooCommerce mit externen Payment-Providern (Stripe, PayPal) einsetzen, sollten Sie SameSite=Lax statt Strict wählen — andernfalls geht beim Redirect von der Payment-Seite zurück zum Shop die Warenkorb-Session verloren. Schritt 3 zeigt die differenzierte Konfiguration.

2 Schritt 2 von 4

wp-config.php — FORCE_SSL_ADMIN und Cookie-Domain

Die wp-config.php steuert globale WordPress-Einstellungen. FORCE_SSL_ADMIN erzwingt HTTPS für Login und Admin-Bereich — eine Voraussetzung dafür, dass das Secure-Flag auf den Auth-Cookies wirksam gesetzt werden kann. Optional können Sie mit COOKIE_DOMAIN Session-Sharing zwischen Haupt-Domain und Subdomains aktivieren.

wp-config.php FORCE_SSL_ADMIN
// wp-config.php — vor "That's all, stop editing!" einfügen

// Sichere Cookies und HTTPS für den Admin-Bereich erzwingen
define('FORCE_SSL_ADMIN', true);

// Optional: Cookie-Domain für Subdomain-Sharing
// Ermöglicht Session-Sharing zwischen example.com und www.example.com
define('COOKIE_DOMAIN', '.example.com'); // Punkt-Prefix = alle Subdomains
Konstante Wert Effekt
FORCE_SSL_ADMIN true Login + Admin zwingend über HTTPS
COOKIE_DOMAIN '.example.com' Session gilt für alle Subdomains
COOKIEHASH MD5 der Siteurl Basis für Cookie-Namen (automatisch)
Stellen Sie sicher, dass ein gültiges SSL-Zertifikat aktiv ist, bevor Sie FORCE_SSL_ADMIN setzen. Ohne Zertifikat sperren Sie sich selbst aus dem Admin-Bereich aus.
3 Schritt 3 von 4

SameSite für WordPress-Cookies

Für Standard-WordPress-Installationen reicht SameSite=Strict für alle Cookies. Wer WooCommerce mit externen Payment-Providern betreibt, braucht eine differenzierte Strategie: Admin- und Sicherheits-Cookies mit Strict, Session- und Warenkorb-Cookies mit Lax.

functions.php — WooCommerce-kompatibel SameSite
// WooCommerce-kompatible SameSite-Konfiguration
// Für Shops mit externen Payment-Providern: Lax statt Strict verwenden

function add_samesite_to_cookies($headers) {
    if (isset($headers['Set-Cookie'])) {
        $cookies = (array) $headers['Set-Cookie'];
        foreach ($cookies as &$cookie) {
            if (stripos($cookie, 'SameSite') === false) {
                // Admin/Auth-Cookies: Strict | WooCommerce/Session-Cookies: Lax
                if (strpos($cookie, 'wordpress_sec') !== false) {
                    $cookie .= '; SameSite=Strict';
                } else {
                    $cookie .= '; SameSite=Lax';
                }
            }
        }
        $headers['Set-Cookie'] = $cookies;
    }
    return $headers;
}
add_filter('wp_headers', 'add_samesite_to_cookies');
WordPress-Cookie Zweck Empfehlung
wordpress_sec_* Admin-Authentifizierung SameSite=Strict
wordpress_logged_in_* Login-Status (Frontend) SameSite=Lax (Kompatibilität)
woocommerce_* Warenkorb / Session SameSite=Lax (Payment-Redirects)
Ersetzen Sie den Code aus Schritt 1

Wenn Sie WooCommerce betreiben, ersetzen Sie die add_samesite_to_cookies-Funktion aus Schritt 1 durch die differenzierte Version auf dieser Seite. Fügen Sie nicht beide Versionen ein — der gleiche Filter-Name würde zu einem Konflikt führen.

4 Schritt 4 von 4

Verifizierung in WordPress

Nach der Konfiguration prüfen Sie, ob die Cookie-Flags korrekt gesetzt werden. Testen Sie sowohl den Login-Vorgang (Auth-Cookies) als auch die Admin-Umleitung (FORCE_SSL_ADMIN). Browser DevTools zeigen alle Cookie-Attribute auf einen Blick.

Terminal Verifizierung
# 1. WordPress-Login-Seite aufrufen und Cookies prüfen
curl -sI -c /tmp/cookies.txt -b /tmp/cookies.txt \
  -X POST https://ihre-domain.de/wp-login.php \
  --data "log=admin&pwd=passwort&wp-submit=Login" \
  | grep -i set-cookie

# Erwartete Ausgabe (vereinfacht):
# Set-Cookie: wordpress_logged_in_...; Secure; HttpOnly; SameSite=Strict
# Set-Cookie: wordpress_sec_...; Secure; HttpOnly; SameSite=Strict

# 2. Admin-Bereich: FORCE_SSL_ADMIN prüfen (sollte auf HTTPS umleiten)
curl -sI http://ihre-domain.de/wp-admin/ | grep -i location
Browser DevTools — Application → Cookies

Öffnen Sie DevTools (F12) → Application → Cookies → Ihre Domain. Nach dem Login sollten wordpress_logged_in_* und wordpress_sec_* in den Spalten HttpOnly, Secure und SameSite korrekte Werte zeigen. Das Secure-Flag erscheint nur, wenn die Seite über HTTPS aufgerufen wird.

Wie steht Ihre Domain bei Cookie-Sicherheit?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.

Häufig gestellte Fragen

Welche Cookie-Namen setzt WordPress standardmäßig?

WordPress setzt bei der Anmeldung mehrere Cookies: wordpress_logged_in_[hash] (Login-Status, sichtbar für JS), wordpress_sec_[hash] (Admin-Authentifizierung, HttpOnly), wp-settings-[userId] (Editor-Einstellungen) sowie comment_author_ und comment_author_email_ für Kommentare. Der Hash im Namen basiert auf dem COOKIEHASH-Wert aus wp-config.php (standardmäßig der MD5-Hash der Siteurl). Alle Authentifizierungs-Cookies sollten Secure und SameSite=Strict tragen.

Plugin oder Code — was ist besser für Cookie-Sicherheit in WordPress?

Für Cookie-Flags ist der Code-Ansatz (functions.php + wp-config.php) die zuverlässigere Wahl: Er ist nicht von Plugin-Updates abhängig, läuft immer und erzeugt keinen zusätzlichen Overhead. Plugins wie "Headers & Cookie Security" oder "WP Headers" sind eine gute Alternative für Nutzer ohne Entwicklerkenntnisse, haben aber Abhängigkeiten und können deaktiviert werden. Wenn Sie Entwickler-Zugriff haben, bevorzugen Sie den direkten Code-Ansatz.

Funktioniert FORCE_SSL_ADMIN auch ohne gültiges SSL-Zertifikat?

Nein. FORCE_SSL_ADMIN leitet das WordPress-Backend auf HTTPS um — ist kein gültiges Zertifikat vorhanden, erscheint eine Zertifikatswarnung und das Backend ist nicht mehr nutzbar. Stellen Sie sicher, dass Ihr SSL-Zertifikat (z.B. via Let's Encrypt) aktiv und gültig ist, bevor Sie diese Konstante setzen. Wer noch kein Zertifikat hat, kann kostenlos eins über Certbot beziehen.

Verlieren Nutzer ihre Session nach dem Aktivieren von SameSite=Strict?

Bestehende Sessions bleiben erhalten. Neue Cookies werden mit SameSite=Strict gesetzt. Ein relevanter Seiteneffekt: Nutzer, die über einen externen Link (z.B. E-Mail, Bookmark) direkt zu einer geschützten Seite navigieren, müssen sich neu anmelden, da der Cookie beim Cross-Site-Request nicht mitgesendet wird. Für öffentliche Blogs mit häufig externen Besuchern kann SameSite=Lax besser geeignet sein.

WooCommerce: Gibt es besondere Cookie-Anforderungen?

Ja. WooCommerce setzt zusätzliche Cookies: woocommerce_cart_hash und woocommerce_items_in_cart (Session-Erkennung), wp_woocommerce_session_[hash] (Warenkorb-Daten) sowie woocommerce_recently_viewed. Für den Checkout mit externen Payment-Providern (Stripe, PayPal) darf SameSite nicht auf Strict gesetzt werden — der Redirect von der Payment-Seite zurück zum Shop würde die Session/Warenkorb-Cookies nicht mitsenden und der Checkout würde scheitern. Verwenden Sie für WooCommerce SameSite=Lax.

Wie setze ich unterschiedliche SameSite-Werte für verschiedene WordPress-Cookies?

Im wp_headers-Filter können Sie gezielt nach Cookie-Namen unterscheiden: Prüfen Sie mit strpos() ob der Cookie-Name mit "wordpress_logged_in" beginnt (dann SameSite=Lax für Kompatibilität) oder mit "wordpress_sec" (dann SameSite=Strict für maximale Sicherheit). Drittanbieter-Cookies wie Stripe-Session-Cookies sollten Sie gar nicht anfassen — die kommen nicht über WordPress.

Muss ich die functions.php im Child-Theme bearbeiten?

Ja, unbedingt. Änderungen in der functions.php des Parent-Themes werden bei Theme-Updates überschrieben. Erstellen Sie immer ein Child-Theme und tragen Sie den Code dort ein — oder besser noch: in ein Site-Specific Plugin (ein eigenes Mini-Plugin nur für Ihre Anpassungen), das vollständig theme-unabhängig ist.