CSP für Apache konfigurieren
Schritt-für-Schritt-Anleitung: Content Security Policy auf Apache einrichten, testen und aktivieren — mit fertigen .htaccess-Konfigurationen zum Kopieren.
Content Security Policy auf Apache
Sie betreiben Ihre Website auf Apache — ob auf einem Shared-Hosting-Paket bei All-Inkl, Strato oder IONOS, oder auf einem eigenen Server. Die gute Nachricht: Für eine Content Security Policy brauchen Sie keinen Root-Zugriff und keinen Server-Neustart. Eine einzige .htaccess-Datei im Web-Root genügt, um den mächtigsten Schutz gegen Cross-Site Scripting (XSS) zu aktivieren.
Voraussetzung ist das Modul mod_headers, das bei allen gängigen Hostern vorinstalliert ist. Der <IfModule>-Wrapper in der Konfiguration stellt sicher, dass Apache die Zeilen einfach ignoriert, falls das Modul nicht geladen ist — kein 500-Fehler, kein Risiko. CSP beeinflusst mit 35 von 166 Punkten Ihre Web Security Note stärker als jeder andere Header.
Report-Only Modus starten
Beginnen Sie immer im Report-Only-Modus. Der Browser meldet CSP-Verstöße in der Konsole und an Ihren Reporting-Endpoint, blockiert aber keine Ressourcen. So können Sie die Policy in Ruhe anpassen, ohne dass Ihre Website für Besucher kaputt geht.
# .htaccess - Report-Only CSP zum Testen
<IfModule mod_headers.c>
Header always set Reporting-Endpoints 'csp-endpoint="https://ihre-domain.de/api/csp-report"'
Header always set Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; report-uri /api/csp-report; report-to csp-endpoint"
</IfModule> Der <IfModule mod_headers.c> Block stellt sicher, dass Apache die Konfiguration ignoriert, wenn mod_headers nicht geladen ist — statt mit einem 500-Fehler abzustürzen.
sudo systemctl reload apache2 # oder .htaccess speichern — kein Neustart nötig 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 |
Enforcement aktivieren
Wenn keine unerwarteten Violations mehr auftreten, ändern Sie den Header-Namen. Entfernen Sie -Report-Only — der Browser blockiert ab sofort nicht autorisierte Ressourcen.
# .htaccess - Produktions-CSP
<IfModule mod_headers.c>
Header always set Reporting-Endpoints 'csp-endpoint="https://ihre-domain.de/api/csp-report"'
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; 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'; report-uri /api/csp-report; report-to csp-endpoint"
</IfModule> Reporting-Endpoints-Header bei, um auch im Enforcement-Modus Violations zu erfassen. sudo systemctl reload apache2 # oder .htaccess speichern — kein Neustart nötig 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. Apache .htaccess-Dateien sind jedoch statisch und können keine dynamischen Werte generieren. Es gibt zwei Alternativen:
Alternative 1: PHP-basierte Nonces
Wenn PHP auf Ihrem Server verfügbar ist, können Sie Nonces direkt im PHP-Code generieren und den CSP-Header dynamisch setzen.
<?php
// Dynamischen Nonce generieren
$nonce = base64_encode(random_bytes(16));
header("Content-Security-Policy: script-src 'nonce-{$nonce}' 'strict-dynamic'; object-src 'none'; base-uri 'self';");
?>
<!-- In HTML: -->
<script nonce="<?= htmlspecialchars($nonce) ?>">
console.log('Autorisiertes Script');
</script> Alternative 2: Hash-basierte CSP
Für rein statische Seiten ohne PHP: Berechnen Sie den SHA-256-Hash jedes Inline-Scripts und fügen Sie ihn der CSP hinzu. Kein dynamischer Nonce nötig.
# Hash des Inline-Scripts in der CSP erlauben
<IfModule mod_headers.c>
Header always set Content-Security-Policy "script-src 'self' 'sha256-BASE64_HASH_HIER'; object-src 'none'; base-uri 'self';"
</IfModule> Wenn Sie rein statische HTML-Seiten ausliefern, verwenden Sie Hash-basierte CSP statt Nonces. Berechnen Sie den SHA-256-Hash jedes Inline-Scripts und fügen Sie ihn der CSP hinzu. Den Hash berechnen Sie z.B. mit echo -n 'SCRIPT_INHALT' | openssl dgst -sha256 -binary | openssl base64.
Wie steht Ihre Domain bei Content Security Policy?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.