CSP für WordPress konfigurieren
Schritt-für-Schritt-Anleitung: Content Security Policy auf WordPress einrichten, testen und aktivieren — mit fertigen functions.php-Snippets zum Kopieren.
Content Security Policy auf WordPress
WordPress ist mit über 43 % Marktanteil das meistgenutzte CMS der Welt — und gleichzeitig eines der häufigsten Angriffsziele. Eine Content Security Policy (CSP) schützt Ihre WordPress-Website effektiv gegen Cross-Site Scripting (XSS), doch die Implementierung ist anspruchsvoller als bei statischen Setups: Das Plugin-Ökosystem injiziert häufig Inline-Scripts ohne Nonce-Unterstützung, und der Gutenberg-Editor benötigt großzügige Freigaben.
Die beste Strategie: Starten Sie mit einer permissiven CSP inklusive 'unsafe-inline', testen Sie ausgiebig im Report-Only-Modus und verschärfen Sie schrittweise. Zwei Wege stehen offen — über die functions.php (volle Kontrolle) oder über Security-Plugins (grafische Oberfläche, ideal für Nicht-Entwickler). Diese Anleitung zeigt beide Ansätze in vier Schritten. Der Wolf-Agents Web Security Check prüft CSP automatisch — als Teil der 166 Prüfpunkte.
Report-Only Modus starten
Beginnen Sie immer im Report-Only-Modus. Der Browser meldet CSP-Verstöße in der Konsole, blockiert aber keine Ressourcen. So können Sie die Policy in Ruhe anpassen, ohne dass Ihre WordPress-Website für Besucher kaputt geht.
// functions.php
function add_csp_header() {
// Report-Only für sicheres Testen
header("Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;");
}
add_action('send_headers', 'add_csp_header'); Die Plugins Headers Security Advanced und HTTP Headers bieten eine grafische Oberfläche für CSP-Konfiguration — ideal wenn Sie functions.php nicht bearbeiten möchten.
'unsafe-inline' für Scripts. Starten Sie deshalb mit 'unsafe-inline' in der script-src und entfernen Sie es erst in Schritt 4 mit Nonces. Violations analysieren und CSP anpassen
Öffnen Sie die Browser DevTools (F12) → Console. CSP-Violations erscheinen als Warnungen mit der blockierten Ressource und der verantwortlichen Direktive. Passen Sie die Policy an, bis keine unerwarteten Violations mehr auftreten.
| Violation | Lösung |
|---|---|
| Inline-Script blockiert | Nonce oder Hash hinzufügen (siehe Schritt 4) |
| Externe Bibliothek blockiert | Domain zu script-src hinzufügen |
| Google Fonts blockiert | fonts.googleapis.com → style-src, fonts.gstatic.com → font-src |
| Google Analytics blockiert | *.google-analytics.com *.googletagmanager.com → script-src |
| WebSocket blockiert | wss://domain.tld → connect-src |
| WordPress-Plugin blockiert | Plugin-Domains zu script-src / style-src hinzufügen |
| jQuery blockiert | Prüfen ob jQuery über CDN oder lokal geladen wird |
/wp-admin), den Editor (Gutenberg/Classic), und alle Formulare (Contact Form 7, WooCommerce Checkout). Enforcement aktivieren
Wenn keine unerwarteten Violations mehr auftreten, wechseln Sie von Content-Security-Policy-Report-Only zu Content-Security-Policy. Der Browser blockiert ab sofort nicht autorisierte Ressourcen.
// functions.php - Produktions-CSP
function add_csp_header() {
$csp = "default-src 'self'; "
. "script-src 'self' 'unsafe-inline'; "
. "style-src 'self' 'unsafe-inline'; "
. "img-src 'self' data: https:; "
. "font-src 'self'; "
. "connect-src 'self'; "
. "frame-ancestors 'self'; "
. "object-src 'none'; "
. "base-uri 'self'; "
. "form-action 'self'";
header("Content-Security-Policy: " . $csp);
}
add_action('send_headers', 'add_csp_header'); Nonces einrichten für maximale Sicherheit
Nonces sind einmalige Token, die bei jedem Request neu generiert werden. Mit Nonces können Sie 'unsafe-inline' aus Ihrer CSP entfernen — das höchste Sicherheitsniveau. WordPress bietet über den script_loader_tag-Filter die Möglichkeit, alle registrierten Scripts automatisch mit einem Nonce zu versehen.
// functions.php - Vollständige Nonce-Implementierung
function wp_csp_nonce() {
static $nonce;
if (!$nonce) {
$nonce = base64_encode(random_bytes(16));
}
return $nonce;
}
function add_csp_header() {
$nonce = wp_csp_nonce();
header("Content-Security-Policy: script-src 'nonce-{$nonce}' 'strict-dynamic'; object-src 'none'; base-uri 'self';");
}
add_action('send_headers', 'add_csp_header');
function add_nonce_to_scripts($tag, $handle, $src) {
$nonce = wp_csp_nonce();
if (strpos($tag, 'nonce=') === false) {
$tag = str_replace('<script ', '<script nonce="' . esc_attr($nonce) . '" ', $tag);
}
return $tag;
}
add_filter('script_loader_tag', 'add_nonce_to_scripts', 10, 3); 'unsafe-inline' beibehalten. Wie steht Ihre Domain bei Content Security Policy?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.