Content-Security-Policy fehlt

Worum es geht

Ihre Website sendet den Header Content-Security-Policy nicht. Dieser Header teilt dem Browser mit, aus welchen Quellen er Skripte, Bilder, Schriften und iframes laden darf.

Ohne ihn führt der Browser jeden Code aus, der im HTML auftaucht — egal, ob ihn Ihr Team dort platziert hat oder ein Angreifer per XSS.

Warum das ein Problem ist

CSP ist die einzige wirksame Verteidigung gegen Cross-Site-Scripting (XSS). Wenn ein Angreifer irgendwo in der Anwendung eine Lücke findet, durch die er ein <script> einschleust, führt der Browser dieses Skript ohne CSP bereitwillig aus. Mit CSP sagt der Browser „diese Quelle steht nicht auf meiner Allowlist“ und das Skript schlägt fehl.

Die zweite Ebene ist der Schutz vor eingeschleusten Drainern und SEO-Spam. Wenn Sie script-src korrekt konfiguriert haben, kann ein Angreifer über ein gehacktes Plugin nicht einfach ein externes Skript hinzufügen.

Wie man es behebt

CSP ist eine Richtlinie, die die Seite kaputt machen kann. Setzen Sie sie zuerst im Report-only-Modus ein.

Phase 1 — report-only

Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data: https:; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; report-uri /csp-report

Diese Richtlinie blockiert nichts — sie sendet bei jedem Verstoß nur ein JSON an /csp-report. Beobachten Sie die Logs einige Tage lang, um herauszufinden, welche Skripte/Bilder/Schriften die Seite tatsächlich verwendet.

Phase 2 — Allowlist verfeinern

Stellen Sie aus den Reports eine konkrete Allowlist zusammen. Beispiel für WordPress mit Google Fonts und Umami-Analytics:

Content-Security-Policy:
  default-src 'self';
  script-src 'self' https://i.xhs.cz;
  style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
  font-src 'self' https://fonts.gstatic.com;
  img-src 'self' data: https://*.gravatar.com;
  connect-src 'self' https://i.xhs.cz;
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self';

Phase 3 — auf Enforce umschalten

Sobald report-only keine legitimen Verstöße mehr meldet, ändern Sie den Header von Content-Security-Policy-Report-Only zu Content-Security-Policy.

Vorsicht bei 'unsafe-inline'

Inline-Skripte (<script>...</script>) und Inline-Event-Handler (onclick="...") benötigen 'unsafe-inline'. Dadurch verliert CSP aber den größten Teil seines Nutzens gegen XSS. Besser ist es, einen nonce oder einen hash zu verwenden und Inline-Skripte nach und nach zu entfernen. WordPress hat für nonces eine eingebaute Unterstützung.

Konkrete Implementierung

Referenzen