Content Security Policy CSP
Content Security Policy: Sicherheit durch Einschränkung
CSP ist eine der wirksamsten Schutzmaßnahmen gegen XSS. Sie definieren, welche Ressourcen Ihre Website laden darf – alles andere wird blockiert.
Was ist CSP?
Content Security Policy ist ein HTTP-Header, der dem Browser mitteilt, aus welchen Quellen Skripte, Styles, Bilder etc. geladen werden dürfen.
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com
Grundlegende Direktiven
| Direktive | Beschreibung |
|---|---|
default-src |
Fallback für alle anderen |
script-src |
JavaScript-Quellen |
style-src |
CSS-Quellen |
img-src |
Bild-Quellen |
font-src |
Font-Quellen |
connect-src |
Fetch, XHR, WebSocket |
media-src |
Audio, Video |
object-src |
Plugins (Flash etc.) |
frame-src |
Erlaubte iframes |
frame-ancestors |
Wer darf diese Seite einbetten |
base-uri |
Basis-URL einschränken |
form-action |
Formular-Ziele |
Quellen-Werte
| Wert | Bedeutung |
|---|---|
'self' |
Gleiche Origin |
'none' |
Nichts erlaubt |
'unsafe-inline' |
Inline-Skripte/Styles (vermeiden!) |
'unsafe-eval' |
eval() erlauben (vermeiden!) |
'nonce-xyz' |
Skripte mit diesem Nonce erlauben |
'sha256-...' |
Skripte mit diesem Hash erlauben |
https: |
Alle HTTPS-Quellen |
data: |
Data-URLs |
blob: |
Blob-URLs |
Beispiel-Policies
Restriktiv (empfohlen)
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data: https:; font-src 'self'; connect-src 'self' https://api.example.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self';
Mit CDN und Analytics
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net https://www.google-analytics.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: https://www.google-analytics.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://www.google-analytics.com;
Mit Nonce für Inline-Scripts
<?php
$nonce = base64_encode(random_bytes(16));
header("Content-Security-Policy: script-src 'self' 'nonce-$nonce'");
?>
<!-- Erlaubt (mit Nonce) -->
<script nonce="<?= $nonce ?>">
console.log('Erlaubt!');
</script>
<!-- Blockiert (ohne Nonce) -->
<script>
console.log('Blockiert!');
</script>
CSP in Nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; frame-ancestors 'none';" always;
CSP in Apache
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'none';"
Report-Only Modus (Testen)
Testen Sie CSP ohne zu blockieren:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report; report-to csp-endpoint;
Report-Endpoint
<?php
// /csp-report Endpoint
$data = file_get_contents('php://input');
$report = json_decode($data, true);
error_log('CSP Violation: ' . json_encode($report));
Weitere Security Headers
# Komplettes Security-Header-Set Content-Security-Policy: default-src 'self'; frame-ancestors 'none' X-Frame-Options: DENY X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Referrer-Policy: strict-origin-when-cross-origin Permissions-Policy: geolocation=(), microphone=(), camera=()
Nginx komplett
add_header Content-Security-Policy "default-src 'self';" always; add_header X-Frame-Options "DENY" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
Häufige Probleme
❌ Häufige CSP-Fehler:
'unsafe-inline'überall – macht CSP nutzlos- Vergessen, CDNs hinzuzufügen
- Inline Event-Handler (onclick) blockiert
- Google Fonts/Analytics vergessen
Inline Events ersetzen
<!-- ❌ Blockiert durch CSP -->
<button onclick="doSomething()">Klick</button>
<!-- ✅ Funktioniert mit CSP -->
<button id="myButton">Klick</button>
<script>
document.getElementById('myButton').addEventListener('click', doSomething);
</script>
💡 Tipp:
Testen Sie Ihre Security Headers mit dem Enjyn Domain Toolkit oder securityheaders.com.