CSP in PHP konfigurieren
Content Security Policy in PHP einrichten — von Report-Only über Nonce-Generierung mit random_bytes() bis Enforcement. Mit Copy-Paste-Code für header()-Aufrufe und auto_prepend_file.
Content Security Policy in PHP
Content Security Policy (CSP) ist der wichtigste HTTP-Security-Header gegen Cross-Site Scripting (XSS). Er teilt dem Browser mit, welche Ressourcen geladen werden dürfen — und blockiert alles andere. CSP ist mit 35 von 166 Punkten der einflussreichste Header im Wolf-Agents Web Security Check.
In PHP setzen Sie CSP über header() — zwingend bevor die erste Ausgabe erfolgt. Für Nonce-basierte Policies verwenden Sie random_bytes(16) zur kryptografisch sicheren Nonce-Generierung. Über auto_prepend_file in der .user.ini wird der Header automatisch für alle PHP-Dateien gesetzt.
CSP im Report-Only-Modus aktivieren
Beginnen Sie immer im Report-Only-Modus. Der Browser meldet CSP-Verstöße in der Konsole, blockiert aber keine Ressourcen. In PHP generieren Sie pro Request einen frischen Nonce mit random_bytes().
<?php
// CSP Report-Only mit Nonce-Generierung
$nonce = base64_encode(random_bytes(16));
header("Content-Security-Policy-Report-Only: "
. "default-src 'self'; "
. "script-src 'self' 'nonce-" . $nonce . "'; "
. "style-src 'self' 'unsafe-inline'; "
. "img-src 'self' data: https:; "
. "font-src 'self'; "
. "object-src 'none'; "
. "base-uri 'self'; "
. "form-action 'self'; "
. "frame-ancestors 'none'"
);
// Nonce im HTML verwenden:
// <script nonce="<?= htmlspecialchars($nonce) ?>"> Nonces sind in PHP der bessere Ansatz, weil random_bytes() kryptografisch sicher ist und der Nonce automatisch pro Request wechselt. Hashes erfordern, dass Sie den exakten Script-Inhalt kennen — bei dynamischem PHP-Code ist das unpraktisch.
Violations analysieren und Policy anpassen
Öffnen Sie die Browser DevTools (F12) und die Console. CSP-Violations erscheinen als Warnungen mit der blockierten Ressource und der verletzten Direktive. Passen Sie die Policy an, bis keine unerwarteten Violations mehr auftreten.
| Violation | Lösung |
|---|---|
| Google Analytics blockiert | *.google-analytics.com *.googletagmanager.com in script-src |
| Google Fonts blockiert | fonts.googleapis.com in style-src, fonts.gstatic.com in font-src |
| Inline-Scripts ohne Nonce | Alle <script>-Tags mit nonce="<?= htmlspecialchars($nonce) ?>" versehen |
| JavaScript-Auswertung blockiert | Code refactoren — niemals 'unsafe-eval' in der Policy verwenden |
| CDN-Assets blockiert | CDN-Domain zur entsprechenden Direktive hinzufügen |
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.
<?php
// CSP Enforcement — nach erfolgreicher Report-Only-Phase
$nonce = base64_encode(random_bytes(16));
header("Content-Security-Policy: "
. "default-src 'self'; "
. "script-src 'self' 'nonce-" . $nonce . "'; "
. "style-src 'self' 'unsafe-inline'; "
. "img-src 'self' data: https:; "
. "font-src 'self'; "
. "object-src 'none'; "
. "base-uri 'self'; "
. "form-action 'self'; "
. "frame-ancestors 'none'"
);
define('CSP_NONCE', $nonce); Verifizierung und Monitoring
Prüfen Sie den aktiven CSP-Header per curl. Der Wolf-Agents Web Security Check bewertet Ihren CSP-Header automatisch mit bis zu 35 Punkten und zeigt fehlende Direktiven an.
# CSP-Header pruefen
curl -sI https://ihre-domain.de | grep -i content-security-policy
# Erwartete Ausgabe:
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-...'; ... Der Wolf-Agents Web Security Check prüft Ihren CSP-Header automatisch und bewertet ihn mit bis zu 35 Punkten. Mit aktivem Monitoring werden Sie bei Änderungen oder fehlenden Headern sofort benachrichtigt.
Häufige Fehler bei CSP in PHP
Headers already sent — CSP wird nicht gesetzt
Der header()-Aufruf muss vor jeder Ausgabe erfolgen. Ein Leerzeichen oder BOM vor <?php reicht aus. Lösung: ob_start() am Script-Anfang oder auto_prepend_file in der .user.ini verwenden.
Nonce wird nicht im HTML ausgegeben
Der Nonce muss sowohl im CSP-Header als auch in jedem <script>-Tag stehen. Verwenden Sie htmlspecialchars($nonce, ENT_QUOTES) im HTML. Vergessene Nonces führen dazu, dass der Browser alle Inline-Scripts blockiert.
Statischer Nonce bei Full-Page-Cache
Wenn Varnish oder ein CDN die PHP-Response cached, wird der Nonce statisch. Browser blockieren dann alle Scripts. Lösung: Seiten mit CSP-Nonces vom Full-Page-Cache ausschließen oder auf Hash-basierte CSP umsteigen.
Compliance-Relevanz
Eine korrekte Content Security Policy erfüllt zentrale Anforderungen mehrerer Compliance-Frameworks. In PHP ist die Implementierung Sache des Entwicklers — kein Framework setzt CSP automatisch.
Wie steht Ihre Domain bei Content Security Policy?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.