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.

Apache · Schritt für Schritt

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.

1 Schritt 1 von 4

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
# .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>
IfModule-Wrapper

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.

Änderung aktivieren:
sudo systemctl reload apache2  # oder .htaccess speichern — kein Neustart nötig
2 Schritt 2 von 4

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.comstyle-src, fonts.gstatic.comfont-src
Google Analytics blockiert *.google-analytics.com *.googletagmanager.comscript-src
WebSocket blockiert wss://domain.tldconnect-src
Lassen Sie die Policy mindestens 1 Woche im Report-Only-Modus laufen, bevor Sie zu Enforcement wechseln. So erfassen Sie auch selten besuchte Seiten und Edge Cases.
3 Schritt 3 von 4

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 Produktiv
# .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>
Testen Sie gründlich auf allen Seiten — inklusive Login, Checkout und Admin-Bereich — bevor Sie den Report-Only-Modus verlassen. Behalten Sie den Reporting-Endpoints-Header bei, um auch im Enforcement-Modus Violations zu erfassen.
Änderung aktivieren:
sudo systemctl reload apache2  # oder .htaccess speichern — kein Neustart nötig
4 Schritt 4 von 4 · Fortgeschritten

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.

index.php Nonces
<?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.

.htaccess Hash-basiert
# 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>
Ohne PHP?

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.