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.
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 — 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 — 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> '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-Policy | XSS-Angriffe verhindern — definiert erlaubte Ressourcen | Kap. 01 |
Strict-Transport-Security | HTTPS erzwingen — Downgrade-Angriffe verhindern | Kap. 02 |
Permissions-Policy | Browser-APIs deaktivieren — Kamera, Mikrofon, etc. | Kap. 04 |
X-Frame-Options | Clickjacking verhindern — Einbettung kontrollieren | Kap. 05 |
Referrer-Policy | URL-Leaks kontrollieren — Referrer-Informationen begrenzen | Kap. 06 |
X-Content-Type-Options | MIME-Sniffing verhindern — Dateitypen erzwingen | Kap. 07 |
CORP / COOP / COEP | Cross-Origin-Isolation — Spectre-Angriffe verhindern | Kap. 08 |
Reporting-Endpoints | Violation-Reports an Ihren Endpoint senden | Kap. 14 |
Origin-Agent-Cluster | Prozess-Isolation im Browser aktivieren | Kap. 16 |
Verifikation
Prüfen Sie sowohl gecachte als auch dynamische Seiten.
# 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 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.