Lokal & kontrolliert
WISSEN · FÜR ALLE, DIE EINE WEBSITE BETREIBEN

Content Security Policy verstehen

Wie eine CSP eingeschleuste Skripte stoppt, warum viele Richtlinien wenig schützen und wie eine strikte aussieht

Geprüft am 21. September 2026 · etwa 4 Minuten Lesezeit

Kurz gesagt

Eine Content Security Policy sagt dem Browser, woher eine Seite Skripte und andere Inhalte laden darf. Richtig gebaut, stoppt sie die meisten eingeschleusten Skripte selbst dann, wenn die Anwendung eine Lücke hat. Viele Richtlinien schützen aber wenig, weil sie 'unsafe-inline' erlauben oder ganze Domains freigeben: Eine Google-Studie fand 2016 knapp 95 Prozent der untersuchten Richtlinien, die Skripte begrenzen sollten, wirkungslos. Wirksam ist eine strikte Richtlinie, bei der jedes erlaubte Skript eine Einmalkennung oder eine Prüfsumme trägt.

Was eine CSP tut

Einer der folgenreichsten Fehler von Websites ist Cross-Site-Scripting (XSS): Jemand schafft es, ein eigenes Skript in die Seite zu schreiben, und der Browser jedes Besuchers führt es aus. Die eigentliche Abwehr steckt im Code. Die Content Security Policy (CSP) ist die zweite Linie — sie weist den Browser an, nur bestimmte Skripte auszuführen und alle anderen zu ignorieren.

Die Richtlinie besteht aus Direktiven, jede für eine Art von Inhalt. Die wichtigsten:

Die wichtigsten Direktiven
DirektiveregeltHinweis
script-srcwoher Skripte kommen dürfendie wichtigste von allen
default-srcalle Ladevorgänge — Skripte, Stile, Bilder, Schriften, Verbindungen —, für die keine eigene Direktive stehtgilt nicht für base-uri, form-action und frame-ancestors
object-srceingebettete Plugin-Inhalteam besten 'none'
base-uriob die Seite ihre Basisadresse ändern darfsonst lassen sich relative Skriptadressen umbiegen
form-actionwohin Formulare senden dürfenfällt nicht auf default-src zurück
frame-ancestorswer die Seite einbetten darfSchutz vor Clickjacking; wirkt nur als Header
report-towohin der Browser Verstöße meldetbraucht den Header Reporting-Endpoints

Warum viele Richtlinien wenig schützen

  • 'unsafe-inline' in script-src erlaubt jedes Skript, das im HTML selbst steht — also auch ein eingeschleustes. Der Schutz gegen XSS ist damit weitgehend aufgehoben.
  • Platzhalter und Schemata wie *, https: oder data: erlauben Skripte von jeder Adresse beziehungsweise in jeder Form. Ein Angreifer lädt sein Skript dann einfach von dort.
  • Listen erlaubter Adressen wirken strenger, als sie sind: Liegen auf einer erlaubten Adresse Skripte, die sich zweckentfremden lassen, reicht das für eine Umgehung. In einer Google-Studie von 2016 stützten sich drei von vier untersuchten Richtlinien auf Adresslisten, die sich so umgehen ließen.
  • 'unsafe-eval' erlaubt, Text zur Laufzeit als Code auszuführen. Das öffnet einen zweiten Weg für eingeschleusten Code.

Die strikte CSP

Statt aufzuzählen, woher Skripte kommen dürfen, markiert eine strikte Richtlinie die erlaubten Skripte selbst. Der Server erzeugt für jede Antwort eine neue Zufallszahl, die Nonce, schreibt sie in die Richtlinie und an jedes eigene script-Element. Ein eingeschleustes Skript kennt die Zahl nicht und wird nicht ausgeführt.

Content-Security-Policy: script-src 'nonce-t7Kf2Qm9XbR4pZ1wLs8nVg==' 'strict-dynamic'; object-src 'none'; base-uri 'none'
  • Die Nonce muss bei jeder Antwort neu sein, zufällig und lang genug; die Spezifikation nennt mindestens 128 Bit. Eine Nonce, die sich wiederholt, schützt nicht.
  • 'strict-dynamic' erlaubt Skripten, die schon vertrauenswürdig sind, weitere Skripte nachzuladen. Dafür ignoriert der Browser Adresslisten und 'self' in script-src. Ohne Nonce oder Hash blockiert 'strict-dynamic' dagegen fast alle Skripte. Der Preis: Erzeugt ein vertrauenswürdiges Skript neue Skripte aus Daten, die ein Angreifer beeinflussen kann, lässt die Richtlinie auch diese durch. Die Spezifikation rät deshalb, 'strict-dynamic' zu meiden, wo es ohne geht; web.dev empfiehlt es als Teil der strikten CSP, weil es die Einführung erleichtert.
  • Steht neben einer Nonce oder einem Hash auch 'unsafe-inline', ignorieren heutige Browser es. So lässt sich für sehr alte Browser ein Rückfall eintragen, ohne den Schutz zu schwächen.
  • Für Seiten, die sich nicht bei jedem Aufruf ändern, gibt es statt der Nonce die Prüfsumme (Hash) eines Skripts.
Ein dritter Weg für sehr einfache Seiten

Eine Seite, die kein einziges Skript im HTML stehen hat und nur eigene Skriptdateien lädt, kann auch mit script-src 'self' gut fahren. So hält es HexWarte selbst. Das setzt voraus, dass unter der eigenen Adresse nichts liegt, was ein Angreifer als Skript ausliefern lassen könnte, etwa hochgeladene Dateien.

Ein Beispiel: dieselbe Lücke, drei Richtlinien

Ein Kommentarfeld gibt Text ungeprüft aus. Jemand schreibt statt eines Kommentars ein script-Element hinein. Was passiert unter drei verschiedenen Richtlinien?

Was der Browser mit dem eingeschleusten Skript tut
RichtlinieErgebnisWarum
script-src 'self' 'unsafe-inline'wird ausgeführt'unsafe-inline' erlaubt jedes Skript im HTML
script-src 'self' https://cdn.example.orgwird blockiert — aber umgehbardas Skript im HTML ist nicht erlaubt; liegt auf cdn.example.org etwas Zweckentfremdbares, lädt der Angreifer es von dort
script-src 'nonce-…' 'strict-dynamic'; object-src 'none'; base-uri 'none'wird blockiertdas eingeschleuste Skript trägt die Nonce nicht

In allen drei Fällen bleibt die eigentliche Lücke bestehen: Das Kommentarfeld gibt ungeprüften Text aus. Die Richtlinie entscheidet nur, ob daraus ein ausgeführter Angriff wird.

Was du vor einer CSP brauchst

  • Einen Überblick über alle Skripte, Stile, Schriften, eingebetteten Dienste und Verbindungen der Seite.
  • Für eine Nonce einen Server oder eine Anwendung, die bei jeder Antwort eine neue Zufallszahl erzeugen kann. Für statische Seiten stattdessen Hashes.
  • Die Richtlinie als Header, nicht als meta-Element: Im HTML-Kopf eingetragen, fehlen frame-ancestors, Berichte und der Beobachtungsmodus.
  • Den Beobachtungsmodus Content-Security-Policy-Report-Only für den Anfang. Wie die Einführung Schritt für Schritt gelingt, steht in Content Security Policy schrittweise einführen.

Was dieser Artikel nicht sagt

  • Eine CSP behebt keine Lücke. Sie verhindert, dass eingeschleustes Skript ausgeführt wird; die Lücke im Code bleibt und muss geschlossen werden.
  • Sie schützt nicht vor allem. Eingeschleuster Text ohne Skript, täuschend echte Formulare oder Lücken auf dem Server liegen außerhalb dessen, was sie regelt.
  • Sendet eine Seite zwei Richtlinien, müssen beide erfüllt sein; eine zweite kann die Regeln also nur verschärfen, nie lockern. Das überrascht oft, wenn ein vorgeschalteter Dienst eine eigene Richtlinie hinzufügt.
  • Die Beispiele zeigen Grundformen. Welche Richtlinie zu einer Seite passt, hängt davon ab, was sie lädt.