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.

PHP · Schritt für Schritt

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.

1 Schritt 1 von 4

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().

security-headers.php Report-Only
<?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) ?>">
Nonce vs. Hash in PHP

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.

2 Schritt 2 von 4

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
Lassen Sie die Policy mindestens 1 Woche im Report-Only-Modus laufen. Testen Sie alle Seitentypen — Startseite, Formulare, Login, Admin-Panel und Checkout.
3 Schritt 3 von 4

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.

security-headers.php Produktiv
<?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);
Testen Sie nach der Umstellung alle Seitentypen gründlich. Achten Sie besonders auf Login-Formulare, Payment-Flows und Admin-Panels, die Inline-Scripts benötigen können.
4 Schritt 4 von 4

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.

Terminal Verifizierung
# 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-...'; ...
Automatisiertes Monitoring

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.

PCI DSS 4.0Anforderung 6.4.3 — Kontrolle aller auf Zahlungsseiten geladenen Scripts (seit März 2025 verpflichtend)
NIS2Art. 21(e) — Sicherheit bei Erwerb, Entwicklung und Wartung von Netz- und Informationssystemen
BSIAPP.3.1 — Webserver-Absicherung mit Security Headern

Wie steht Ihre Domain bei Content Security Policy?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.