Was eine Content Security Policy macht

Eine Content Security Policy legt fest, aus welchen Quellen deine Seite Skripte und andere Inhalte laden darf. Sie ist der wirksamste Schutz gegen eingeschleuste Skripte.

So funktioniert es

Gelingt es einem Angreifer, eigenen Code in deine Seite zu bringen, etwa über ein Kommentarfeld oder ein unsicheres Plugin, läuft dieser Code im Browser deiner Besucher. Er kann Eingaben mitlesen, Sitzungen übernehmen oder Inhalte austauschen. Das nennt man Cross-Site-Scripting (XSS).

Die Content Security Policy (CSP) ist ein Antwort-Header mit einer Liste von Regeln, den Direktiven. script-src sagt, woher Skripte kommen dürfen, img-src dasselbe für Bilder, default-src gilt für alles, was keine eigene Regel hat. Der Browser blockiert alles, was die Policy nicht erlaubt, und eingeschleuster Code läuft nicht.

Mit Content-Security-Policy-Report-Only meldet der Browser Verstöße nur, statt sie zu verhindern. Das ist zum Testen gedacht, schützt aber nicht.

Worauf es ankommt

  • Durchsetzen statt nur melden. Wenn die Berichte im Report-Only-Modus ruhig sind, sende dieselbe Policy als Content-Security-Policy.
  • Eine Regel für Skripte. Ohne script-src und ohne default-src sind Skripte gar nicht eingeschränkt.
  • Kein 'unsafe-inline' ohne Nonce oder Hash. Damit läuft jedes Skript, das im HTML steht, auch das eingeschleuste. Eine Nonce ist ein Zufallswert, den der Server bei jeder Antwort neu erzeugt und in die Policy ('nonce-…') und an jedes eigene <script> schreibt. Ein Hash ('sha256-…') erlaubt genau ein bekanntes Skript. Steht einer davon in der Policy, ignorieren Browser 'unsafe-inline'.
  • Keine Platzhalter für Skripte. *, https:, http: oder data: erlauben Skripte von überall. Nenne die Hosts, die deine Seite braucht, oder nutze Nonces mit 'strict-dynamic': Dann dürfen erlaubte Skripte weitere nachladen, und Host-Angaben zählen nicht mehr.
  • Kein 'unsafe-eval'. Es lässt Text zur Laufzeit als Code laufen, und genau das nutzen viele Angriffe.
  • object-src und base-uri. object-src 'none' verhindert eingebettete Plugins (wenn default-src fehlt), base-uri 'self', dass jemand die Basisadresse der Seite umbiegt.
  • Mehrere Policies gelten zusammen. Sendet der Server zwei, muss ein Inhalt beide bestehen.

So richtest du es ein

Ein Startwert, den du an deine Seite anpassen musst:

Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'

Sende ihn zuerst als Content-Security-Policy-Report-Only und schau in der Konsole der Entwicklerwerkzeuge, was blockiert würde. Ergänze dann die Quellen, die deine Seite wirklich braucht: Schriften, Analyse, Karten, eingebettete Videos. Tag-Manager und Inline-Skripte von Plugins machen das aufwendig; oft ist der Umstieg auf Nonces der saubere Weg.

Gesetzt wird die Policy im Webserver oder, mit Nonces, in der Anwendung, weil die für jede Antwort neu entstehen. Das ist in der Regel Arbeit für deine Agentur oder Entwickler. Manche CMS haben dafür Plugins oder Einstellungen. Die Direktive frame-ancestors schützt zugleich vor Clickjacking.

Mehr zu Schutz vor Einschleusung

Jetzt deine Website prüfen

Der Security-Check zeigt in wenigen Sekunden, welche Header fehlen, mit fertigen Zeilen zum Kopieren.

Website prüfen