Keine Werbung mögen? Gehen Werbefrei Heute

Inhaltssicherheitsrichtlinie Schreiben einer funktionierenden CSP-Header

Veröffentlicht am
Inhaltssicherheitsrichtlinie: Die Schreibung einer CSP-Header, die tatsächlich funktioniert 1
ANZEIGE Entfernen?

Die meisten Entwickler wissen, dass sie einen Inhaltssicherheitsheader zu ihren Anwendungen hinzufügen sollten. Wenige haben jedoch eine, die tatsächlich etwas nützliches tut. Entweder ist sie zu liberal und verliert damit ihren Zweck, oder sie bricht die Hälfte der Seite und wird aus Frustration entfernt.

Dieser Leitfaden erklärt, was die CSP tut, welche Richtlinien wichtig sind und wie man einen Header schreibt, der echte Angriffe blockiert, ohne die App zu stören.

Was die CSP tatsächlich tut

Eine Inhaltssicherheitsrichtlinie teilt dem Browser mit, wo Ressourcen geladen werden dürfen. Skripte aus diesem Domain. Styles aus dem CDN. Bilder aus überall. Keine inline-Skripte.

Wenn ein Browser einen CSP-Header erhält, überprüft er diese Regeln, bevor er etwas ausführt. Wenn ein Cross-Site-Scripting (XSS)-Angriff ein schädliches Skript in deine HTML-Datei einfügt, blockiert die CSP es auf Browser-Ebene – selbst wenn das Skript deine Eingabe-Validierung umgangen hat.

Das ist der Kernwert: Die CSP ist deine zweite Sicherheitslinie, wenn Eingabevalidierung fehlschlägt.

Die wichtigen Richtlinien

Die CSP verfügt über Dutzende Richtlinien, aber die meisten Produktionsheader benötigen nur sechs:

Richtlinie Was sie einschränkt Häufiger Fehler
default-src Falls ein Ressourcentyp nicht explizit aufgeführt ist Einstellung 'self', dann vergessen, dass Schriftarten und Frames nicht abgedeckt sind
script-src Quellen für JavaScript und inline-Ausführung Hinzufügen 'unsafe-inline' um Konsole-Fehler zu unterdrücken
style-src Quellen für CSS und inline-Stilblöcke Die CDN oder inline-Stile, die von JS-Bibliotheken eingefügt werden, werden vergessen
img-src Quellen für Bilder einschließlich Data-URIs Fehlend data: für base64-Bilder, blob: für Canvas-Exports
connect-src Ziele für XHR, fetch, WebSocket und EventSource Analytics-Endpunkte und API-Unterdomänen werden vergessen
frame-ancestors Welche Quellen ein Site in ein <iframe> Diese wird vollständig übersprungen – Clickjacking bleibt offen

frame-ancestors ersetzt die ältere X-Frame-Options Header und ist wertvoll, selbst bevor du eine vollständige CSP-Abdeckung hast.

Warum unsafe-inline Die Funktion zerstört

Wenn du 'unsafe-inline' Zu script-srchinzufügst, sagst du dem Browser: Führe jedes Skript aus, das du findest, unabhängig von der Quelle. Dazu gehören auch Skripte, die durch XSS-Angriffe injiziert wurden.

'unsafe-eval' ist schlimmer – es erlaubt eval(), Function()und setTimeout("string"), die häufige Angriffsvektoren sind, selbst in sonst sauberen Codebasen.

Eine Richtlinie mit diesen Dokumenten dokumentiert deine Quellen, ohne echte Injection-Schutz zu bieten. Der Angreifer interessiert sich nicht, wo deine legitimen Skripte geladen werden, wenn sie ihre eigenen inline-Skripte injizieren können.

Die richtige Methode: Nonces und Hashes

Wenn du legitime inline-Skripte hast, hast du zwei Optionen, die deine Richtlinie nicht aufgeben:

Nonces erzeugen einen eindeutigen Token pro Seitenaufruf. Der Server fügt es dem CSP-Header und der inline-Skript-Attribute hinzu. Nur Skripte mit einem übereinstimmenden Nonce werden ausgeführt. nonce Hashes

<!-- CSP header -->
Content-Security-Policy: script-src 'nonce-abc123xyz'

<!-- Inline script with matching nonce -->
<script nonce="abc123xyz">
  window.analyticsId = '...';
</script>

berechnen einen SHA-256-Fingerprint des genauen Skriptinhalts. Füge diesen Hash hinzu und der Browser führt dieses spezifische Skript aus – aber nichts anderes. script-src Nonces funktionieren besser für dynamische Seiten, bei denen der Inhalt pro Anfrage variiert. Hashes eignen sich für statische Skripte, die zwischen Bereitstellungen nie ändern.

Content-Security-Policy: script-src 'sha256-RFWPLDbv2BY+rCkDzsE+0fr8ylGr2R2faWMhq4lfEQc='

Mit Report-Only-Modus deployen

Das Hinzufügen von CSP zu einer bestehenden Website ohne Test ist die Art, wie man sie in der Produktion kaputt macht. Beginne stattdessen mit dem Report-Only-Header:

Der Browser wendet die Regeln an und meldet Verstöße – er blockiert nichts noch. Diese Verstoßprotokolle zeigen dir genau, was du dem Header hinzufügen musst, bevor du den Modus in die Produktion wechselst.

Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' 'nonce-{random}'; report-uri /csp-violations

Die meisten CSP-Implementierungen, die Websites kaputt machen, haben diesen Schritt übersprungen.

Ein echter CSP für eine typische SaaS-Anwendung

Hier ist ein für eine Anwendung mit CDN, Google Analytics und Stripe geeigneter Header. Jede Richtlinie ist kommentiert:

mit einem kryptografisch zufälligen Wert, der pro Anfrage generiert wird – z. B. in PHP oder

Content-Security-Policy:
  # Tight default: only load from your own origin
  default-src 'self';

  # Scripts: your origin, GA tag manager via nonce, Stripe.js
  script-src 'self' https://www.googletagmanager.com https://js.stripe.com 'nonce-{SERVER_NONCE}';

  # Styles: your origin and Google Fonts CSS
  style-src 'self' https://fonts.googleapis.com;

  # Fonts: your origin and Google Fonts CDN
  font-src 'self' https://fonts.gstatic.com;

  # Images: your origin, CDN subdomain, and base64 data URIs
  img-src 'self' https://cdn.yourdomain.com data:;

  # Fetch/XHR: your API, GA collection endpoint, Stripe API
  connect-src 'self' https://www.google-analytics.com https://api.stripe.com;

  # Stripe renders its fields in an iframe
  frame-src https://js.stripe.com;

  # Nobody should be framing your app
  frame-ancestors 'none';

  # Block <object> and <embed> entirely
  object-src 'none';

  # Force HTTP requests to upgrade to HTTPS
  upgrade-insecure-requests;

Express (Node.js) {SERVER_NONCE} in Node. base64_encode(random_bytes(16)) Häufige CSP-Fehler crypto.randomBytes(16).toString('base64') Zu breite Wildcards.

erlaubt Skripte aus jeder Quelle. Du könntest dir den Skript-Header als völlig nutzlos vorstellen.

Unterdomänen vergessen. script-src * deckt nur deine genaue Quelle ab.

ist eine andere Quelle und benötigt eine explizite Eintragung unter 'self' Report-Only-Modus überspringen https://api.yourdomain.com Clickjacking-Schutz ist unabhängig vom XSS-Schutz. Füge ihn separat aus der übrigen Richtlinienmenge hinzu. connect-src.

CSP in mehreren Orten setzen. frame-ancestors. Wenn dein CDN und deine App jeweils einen CSP-Header setzen, wird das Verhalten unvorhersehbar. Setze es an einer Schicht – meistens auf deinem Ursprungsserver oder Reverse Proxy.

ohne Handler. Verstöße generieren POST-Anfragen an deinen Endpunkt bei jedem betroffenen Seitenaufruf. Entweder behandeln oder auf einen Dienst wie Report URI zeigen.

erforderlich ist, wird der Wildcard von dem Browser abgelehnt. Sie müssen die genaue Quelle angeben: report-uri Dein Header ohne Unsicherheit erstellen Die Aufzeichnung aller Domänen, die deine Seite über Skripte, Styles, Schriften, Bilder und API-Aufrufe lädt, wird schnell mühsam. Ein Online

CSP-Header-Generator

erlaubt dir, jede Richtlinie visuell zu konfigurieren und ein produktionsschweres Header-Output zu erhalten, den du direkt in deine Serverkonfiguration einfügen kannst. Nutze ihn als Ausgangspunkt, dann überprüfe deine tatsächlichen Netzwerkaufrufe in DevTools, um etwas zu entdecken, das der Generator verpasst hat. Ein zu lockeres CSP ist Dekoration. Ein zu strenges CSP bricht die Benutzer. Beginne mit Report-Only-Modus, verfeinere danach, und nutze Nonces, wo inline-Skripte unvermeidbar sind. Deine Richtlinie sollte dem Angreifer das Leben schwer machen – nicht dir.

Inhaltssicherheitsrichtlinie: Ein CSP-Header, der tatsächlich funktioniert 2


Inhaltssicherheitsrichtlinie: Ein CSP-Header, der tatsächlich funktioniert 1

Möchten Sie werbefrei genießen? Werde noch heute werbefrei

Erweiterungen installieren

IO-Tools zu Ihrem Lieblingsbrowser hinzufügen für sofortigen Zugriff und schnellere Suche

Zu Chrome-Erweiterung Zu Kantenerweiterung Zu Firefox-Erweiterung Zu Opera-Erweiterung

Die Anzeigetafel ist eingetroffen!

Anzeigetafel ist eine unterhaltsame Möglichkeit, Ihre Spiele zu verfolgen. Alle Daten werden in Ihrem Browser gespeichert. Weitere Funktionen folgen in Kürze!

ANZEIGE Entfernen?
ANZEIGE Entfernen?
ANZEIGE Entfernen?

Nachrichtenecke mit technischen Highlights

Beteiligen Sie sich

Helfen Sie uns, weiterhin wertvolle kostenlose Tools bereitzustellen

Kauf mir einen Kaffee
ANZEIGE Entfernen?