Content-Security-Policy (CSP): Einstieg ohne kaputte Website
Stand: 3. Oktober 2026 · CAZ Labs
Kurz gesagt
Die Content-Security-Policy ist ein HTTP-Header, der festlegt, von welchen Quellen deine Seite Skripte, Styles, Bilder und Frames laden darf. Gelingt es jemandem, fremden Code einzuschleusen, blockiert der Browser ihn. Eine strenge CSP macht Arbeit, deshalb fängst du mit dem Modus Report-Only an, der nur meldet und nichts blockiert.
Warum das wichtig ist
Bei kleinen Websites läuft ein Angriff oft so ab: Ein veraltetes Plugin hat eine Lücke, ein Bot schreibt darüber Skriptcode in die Datenbank, und ab dann lädt jede Seite Werbung oder eine Weiterleitung auf einen Fake-Shop. Der Fachbegriff dafür ist Cross-Site-Scripting, kurz XSS.
Eine CSP ist das Sicherheitsnetz für diesen Fall. Du sagst dem Browser zum Beispiel: Skripte nur von meiner eigenen Domain und vom Google Tag Manager. Ein eingeschleustes Skript von einer fremden Domain wird dann gar nicht erst geladen. Die Lücke selbst schließt die CSP nicht, das erledigen weiterhin Updates. Sie begrenzt aber den Schaden.
Zur Ehrlichkeit gehört: Eine CSP, die wirklich schützt, ist Arbeit. Gerade WordPress-Seiten mit Page Builder, Tracking und Cookie-Banner laden Code aus vielen Quellen, oft auch direkt im HTML (inline). Jede Quelle muss in die Policy, und Inline-Code verlangt Ausnahmen, die den Schutz schwächen, oder Umbauten. Rechne mit ein paar Stunden und einer Phase, in der du nachbesserst.
So prüfst du es selbst
In den Entwicklertools (F12) unter „Netzwerk“ beim ersten Eintrag nach content-security-policy suchen, oder im Terminal:
curl -sI https://example.de | grep -i content-securityWas checkfrei prüft
checkfrei sucht den Header Content-Security-Policy (oder eine Policy im Meta-Tag). Fehlt sie, gibt es eine Warnung. Eine Policy nur im Modus Report-Only reicht für den grünen Haken noch nicht, sie ist der Weg dorthin. Wie streng deine Policy ist, bewertet checkfrei nicht. Dafür eignet sich der CSP Evaluator von Google. Den Stand deiner Header zeigt der kostenlose Check.
So behebst du es
Geh in vier Schritten vor. Ein möglicher Ausgangspunkt für die Policy steht unter den Schritten, in der echten Konfiguration schreibst du alles in eine Zeile.
Im Beispiel steht bei Styles 'unsafe-inline', ein verbreiteter Kompromiss. Bei script-src solltest du es vermeiden, weil es genau den Code erlaubt, gegen den die CSP schützen soll. Für Inline-Skripte gibt es Nonces oder Hashes, das verlangt aber Eingriffe in Theme oder Anwendung. Dienste wie Google Analytics brauchen zusätzliche Einträge, welche, verrät dir die Konsole.
- Policy im Modus Report-Only setzen. Der Header heißt dann
Content-Security-Policy-Report-Only, der Browser blockiert nichts und meldet nur. - Die Seite gründlich durchklicken, auch Formulare, Checkout und Cookie-Banner. Die Verstöße stehen in der Browser-Konsole (F12).
- Jede legitime Quelle in die Policy aufnehmen. Eine Domain, die du nicht kennst, ist ein Grund, genauer hinzusehen.
- Nach ein bis zwei Wochen ohne neue Meldungen den Header in
Content-Security-Policyumbenennen.
Content-Security-Policy-Report-Only:
default-src 'self';
script-src 'self' https://www.googletagmanager.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
frame-src https://www.youtube-nocookie.com;
frame-ancestors 'self';
object-src 'none';
base-uri 'self'Apache (.htaccess)
Gilt auch für WordPress auf Apache- oder LiteSpeed-Hosting. Das Beispiel ist bewusst knapp, die Quellen aus deinen Report-Only-Meldungen ergänzt du nach und nach.
<IfModule mod_headers.c>
Header always set Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
</IfModule>nginx
add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" always;WordPress
Den Header setzt du am einfachsten über die .htaccess. Plugins nehmen dir die eigentliche Arbeit nicht ab, denn welche Quellen deine Seite braucht, hängt an Theme und Plugins. Weil die .htaccess auch für /wp-admin gilt, teste den Backend-Bereich und den Editor gründlich, bevor du scharf schaltest.
Next.js
Eine feste Policy setzt du über headers() in der next.config, wie im Ratgeber zu HSTS. Für Nonces empfiehlt die Next.js-Dokumentation, den Header pro Anfrage in der Middleware zu erzeugen (in neueren Versionen heißt sie Proxy). Im Entwicklungsmodus braucht Next.js zusätzlich 'unsafe-eval'.
HTML
Ohne Zugriff auf Server-Header kannst du die Policy als <meta http-equiv="Content-Security-Policy" content="..."> in den Kopf der Seite schreiben. checkfrei erkennt das. Der Meta-Tag hat aber Lücken: frame-ancestors und Report-Only funktionieren dort nicht.
Vercel und Netlify
Bei Vercel kommt der Header in die vercel.json, bei Netlify in die Datei _headers. Ein Beispiel steht im Ratgeber zu X-Content-Type-Options.
Typische Fehler
- Die Policy direkt scharf schalten. Dann fehlt nach dem Livegang das Kontaktformular oder der Cookie-Banner, und keiner merkt es sofort.
script-srcmit'unsafe-inline'undhttps:als Quelle. Damit ist der Header da, schützt aber kaum noch etwas.
So prüft checkfrei
Wir suchen den Header Content-Security-Policy. Fehlt er, gibt es eine Warnung.
Gewicht 1 von 3 im Bereich Sicherheit.
Häufige Fragen
Was ist der Unterschied zwischen Content-Security-Policy und Report-Only?
Content-Security-Policy blockiert alles, was nicht erlaubt ist. Content-Security-Policy-Report-Only meldet Verstöße nur in der Konsole oder an eine Report-Adresse und lässt alles durch. Report-Only ist zum Testen da.
Braucht eine kleine Firmenwebsite eine CSP?
Pflicht ist sie nicht, checkfrei wertet ihr Fehlen nur als Warnung. Sinnvoll ist sie vor allem bei WordPress mit vielen Plugins, bei Shops und bei Seiten mit Login. Eine einfache Policy mit frame-ancestors, object-src und base-uri ist ein guter erster Schritt.
Jetzt deine Seite prüfen
checkfrei prüft Content-Security-Policy und 68 weitere Punkte in einem Durchgang. Kostenlos und ohne Anmeldung.