Alle Security Headers für WordPress konfigurieren

Dual-Layer-Konfiguration: functions.php für dynamische Seiten plus .htaccess als Fallback — so sind auch gecachte Seiten geschützt.

WordPress · Vollständige Konfiguration

Dual-Layer Security Headers für WordPress

WordPress braucht zwei Konfigurationsstellen, weil Page-Caching-Plugins (WP Super Cache, W3 Total Cache, LiteSpeed Cache) PHP umgehen. Header aus functions.php fehlen dann auf gecachten Seiten. Die .htaccess sichert diese ab, weil Apache sie vor PHP verarbeitet.

Die CSP für WordPress enthält 'unsafe-inline' und 'unsafe-eval', weil Page Builder wie Elementor und Divi diese benötigen. Wenn Sie Block-Themes ohne Page Builder verwenden, können Sie auf eine strengere CSP umsteigen — Details im CSP-Kapitel.

Schritt 1: functions.php

Für dynamische (nicht gecachte) Seiten. Setzen Sie die Header über den send_headers-Hook.

functions.php Dynamisch
// functions.php — Security-Header für dynamische Seiten
// Generiert aus Wolf-Agents Web Security Guide, Kapitel 00-16

function wolf_security_headers() {
    if (headers_sent()) return;

    // Kein Nonce für Admin-Bereich (bricht Gutenberg/Plugins)
    if (is_admin()) return;

    // --- Kap 01: Content Security Policy ---
    // ANPASSEN: Ersetzen Sie die Domains durch Ihre eigenen
    // Hinweis: 'unsafe-inline' und 'unsafe-eval' sind für Page Builder
    // (Elementor, Divi) leider notwendig
    $csp = "default-src 'self'; "
         . "script-src 'self' 'unsafe-inline' 'unsafe-eval'; "
         . "style-src 'self' 'unsafe-inline'; "
         . "img-src 'self' data: https:; "
         . "font-src 'self' data:; "
         . "connect-src 'self'; "
         . "object-src 'none'; "
         . "worker-src 'self'; "
         . "frame-ancestors 'self'; "
         . "base-uri 'self'; "
         . "form-action 'self'; "
         . "upgrade-insecure-requests";
    header("Content-Security-Policy: {$csp}");

    // --- Kap 02-16: Alle weiteren Header ---
    header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
    header('Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=(), bluetooth=(), idle-detection=(), serial=(), browsing-topics=(), unload=()');
    header('X-Frame-Options: SAMEORIGIN');
    header('Referrer-Policy: strict-origin-when-cross-origin');
    header('X-Content-Type-Options: nosniff');
    header('Cross-Origin-Resource-Policy: same-origin');
    header('Cross-Origin-Opener-Policy: same-origin');
    header('Cross-Origin-Embedder-Policy: credentialless');
    header('Reporting-Endpoints: csp-endpoint="https://ihre-domain.de/csp-report"');
    header('Origin-Agent-Cluster: ?1');
}
add_action('send_headers', 'wolf_security_headers');

Schritt 2: .htaccess (Fallback)

Für gecachte Seiten, bei denen PHP übersprungen wird.

.htaccess Fallback
# .htaccess — Security-Header Fallback für gecachte Seiten
<IfModule mod_headers.c>
    # ANPASSEN: CSP an Ihre Anforderungen anpassen
    Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; connect-src 'self'; object-src 'none'; worker-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; upgrade-insecure-requests"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), bluetooth=(), idle-detection=(), serial=(), browsing-topics=(), unload=()"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Cross-Origin-Resource-Policy "same-origin"
    Header always set Cross-Origin-Opener-Policy "same-origin"
    Header always set Cross-Origin-Embedder-Policy "credentialless"
    Header always set Reporting-Endpoints "csp-endpoint=\"https://ihre-domain.de/csp-report\""
    Header always set Origin-Agent-Cluster "?1"
</IfModule>
Page Builder und CSP: Elementor und Divi benötigen 'unsafe-inline' und 'unsafe-eval'. Block-Themes ohne Page Builder erlauben eine strengere CSP — Details im CSP-Kapitel.

Was jeder Header macht

Header Schutz Kapitel
Content-Security-PolicyXSS-Angriffe verhindern — definiert erlaubte RessourcenKap. 01
Strict-Transport-SecurityHTTPS erzwingen — Downgrade-Angriffe verhindernKap. 02
Permissions-PolicyBrowser-APIs deaktivieren — Kamera, Mikrofon, etc.Kap. 04
X-Frame-OptionsClickjacking verhindern — Einbettung kontrollierenKap. 05
Referrer-PolicyURL-Leaks kontrollieren — Referrer-Informationen begrenzenKap. 06
X-Content-Type-OptionsMIME-Sniffing verhindern — Dateitypen erzwingenKap. 07
CORP / COOP / COEPCross-Origin-Isolation — Spectre-Angriffe verhindernKap. 08
Reporting-EndpointsViolation-Reports an Ihren Endpoint sendenKap. 14
Origin-Agent-ClusterProzess-Isolation im Browser aktivierenKap. 16

Verifikation

Prüfen Sie sowohl gecachte als auch dynamische Seiten.

Terminal Prüfung
# Alle Security Headers prüfen
curl -I https://ihre-domain.de 2>/dev/null | grep -iE \
  "content-security|strict-transport|x-frame|x-content-type|referrer-policy|permissions-policy|cross-origin|origin-agent|reporting-endpoints"

# Auf Duplikate prüfen (Dual-Layer kann Header verdoppeln)
curl -I https://ihre-domain.de 2>/dev/null | sort | uniq -di
Duplikat-Check bei WordPress

Da WordPress Header an zwei Stellen setzt, können Duplikate entstehen. Wenn curl -I einen Header doppelt zeigt, entfernen Sie ihn aus der functions.php und lassen nur die .htaccess greifen.

Wie steht Ihre Domain bei Security-Header-Architektur?

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