< Zurück zu Insights

Security

CSP & Security Header: Standard-Setup für moderne Websites

Security Headers sind kein Nice-to-have, sondern ein günstiger und sehr wirksamer Sicherheitshebel: Du gibst dem Browser klare Regeln, welche Inhalte geladen und ausgeführt werden dürfen. Das zentrale Element ist eine sauber eingeführte Content Security Policy. Mit einem kontrollierten Rollout von Report-Only zu Enforce erhöhst du Schutz deutlich, ohne dein Produkt durch blindes Hardening zu brechen.

10.02.2026 · 19 Min

1) TL;DR: Wenn du nur 8 Dinge setzt

Wenn du schnell eine belastbare Baseline brauchst, starte mit einem klaren Kernset. Für viele Websites reicht das bereits, um Risiken spürbar zu reduzieren.

  • Strict-Transport-Security (HSTS) für HTTPS-Erzwingung
  • Content-Security-Policy (CSP) als zentrale Browser-Schutzschicht
  • X-Content-Type-Options: nosniff
  • Referrer-Policy: strict-origin-when-cross-origin
  • Permissions-Policy mit sicheren Defaults
  • frame-ancestors in CSP gegen Clickjacking
  • Optional X-Frame-Options als Legacy-Backstop
  • X-XSS-Protection bewusst auf 0 setzen (veraltet)

2) Was CSP wirklich macht und warum Allowlist-CSP oft scheitert

CSP definiert, welche Ressourcen geladen und welche Skripte ausgeführt werden dürfen. Damit reduzierst du die Angriffsfläche für XSS und vergleichbare Browser-Angriffe.

Host-Allowlist-CSPs wirken oft sauber, werden in realen Projekten aber schnell zu permissiv. Strikte CSP auf Basis von Nonces oder Hashes ist robuster.

  • CSP ist Defense-in-Depth, kein Ersatz für Input-Validierung
  • Strikte Script-Regeln mit Nonce/Hash sind langfristig belastbarer
  • Jede Policy ist produkt- und routing-spezifisch

3) Standard-CSP: zwei praxistaugliche Startpunkte

Ein universeller Copy-Paste-Header ist riskant. Nutze stattdessen Startpunkte und passe sie an echte Ressourcenflüsse und Drittanbieter an.

  • Template A (Content-Seite): default-src 'self', object-src 'none', base-uri 'none', frame-ancestors 'none', form-action 'self'
  • Template B (App/Framework): nonce-basierte script-src mit strict-dynamic plus explizite connect-, img- und style-Regeln
  • Regeln pro Seitentyp pflegen statt global alle Ausnahmen zu erlauben

4) Rollout-Plan ohne Chaos: Report-Only -> Reports -> Enforce

Das professionelle Muster ist immer gleich: erst Sichtbarkeit, dann Durchsetzung. So erkennst du legitime Quellen, ohne direkt Traffic oder Funktionen zu brechen.

  • Schritt 1: Content-Security-Policy-Report-Only aktivieren
  • Schritt 2: Violations clustern und echte Ursachen trennen
  • Schritt 3: Policy schärfen, unnötige Skripte entfernen
  • Schritt 4: Enforce aktivieren und Regressionen weiter überwachen

5) Die wichtigsten Header mit sinnvollen Default-Werten

Neben CSP liefern einige Header sofortigen Schutz mit minimalem Aufwand. Entscheidend ist, dass sie konsistent über alle relevanten Routen gesetzt werden.

  • HSTS: max-age=31536000; includeSubDomains (preload nur bewusst)
  • X-Content-Type-Options: nosniff
  • Referrer-Policy: strict-origin-when-cross-origin
  • Permissions-Policy: nur benötigte Features freigeben
  • frame-ancestors in CSP als primärer Clickjacking-Schutz

6) HSTS richtig einsetzen (inkl. preload-Risiko)

HSTS erzwingt HTTPS im Browser. Das ist stark, aber mit includeSubDomains und preload bindest du dich langfristig: Alle Subdomains müssen HTTPS-sicher betrieben werden.

  • Preload nur setzen, wenn alle Subdomains dauerhaft HTTPS-fähig sind
  • HSTS zuerst in Staging und auf Subdomain-Setups testen
  • Rollback bedenken: preload ist kein Schalter für morgen

7) Referrer-Policy und Permissions-Policy pragmatisch nutzen

Diese beiden Header reduzieren unnötige Datenleaks und schließen Browser-Features, die die Seite gar nicht braucht. Das ist ein sauberer Security-by-default-Ansatz.

  • Referrer-Policy klar setzen statt Browser-Default zu hoffen
  • Mikrofon/Kamera/Geolocation standardmäßig deaktivieren
  • Nur für konkrete Use Cases gezielt freigeben

8) Clickjacking sauber abdecken

Moderne Kontrolle läuft über frame-ancestors in CSP. X-Frame-Options kann als zusätzliche Legacy-Absicherung hilfreich sein, sollte aber nicht die primäre Steuerung sein.

  • Standard für viele B2B-Seiten: frame-ancestors 'none'
  • Wenn Einbettung nötig ist: explizit whitelisten, nie offen lassen
  • X-Frame-Options optional ergänzen (DENY oder SAMEORIGIN)

9) X-XSS-Protection: warum 0 die richtige Entscheidung ist

Der Header gilt als veraltet und kann in modernen Browser-Setups sogar unerwünschte Nebeneffekte haben. Moderne XSS-Mitigation läuft über CSP plus saubere Implementierung im Code.

  • Setze X-XSS-Protection bewusst auf 0
  • Investiere stattdessen in strikte CSP und saubere Sanitization

10) Optionales Hardening: COOP, COEP und CORP

Diese Header sind mächtig, aber nicht pauschal Baseline. Sie können Third-Party-Ressourcen brechen, wenn CORS/CORP-Strategien nicht sauber vorbereitet sind.

  • Nur aktivieren, wenn Cross-Origin-Isolation echten Mehrwert liefert
  • Kompatibilität mit Embeds und externen Skripten vorher testen
  • Rollout in klaren Stufen mit Fallback planen

11) Advanced: Trusted Types als zusätzliche DOM-XSS-Schicht

Trusted Types kann bei komplexen Frontends ein starker zusätzlicher Schutz gegen DOM-basierte XSS-Sinks sein. Einführung erfordert aber technische Disziplin und Tests.

  • Für reife App-Frontends mit hoher JS-Komplexität sinnvoll
  • Nicht blind global aktivieren ohne Kompatibilitätsprüfung

12) Umsetzung in der Realität: global vs route-spezifisch

Nicht jeder Header gehört überall gleich. Baseline-Header setzt du global, CSP differenzierst du nach Seitentyp, damit Marketing-Routen und App-Routen sauber funktionieren.

  • Global: HSTS, nosniff, Referrer-Policy, Permissions-Policy
  • Route-spezifisch: CSP je nach Script- und Third-Party-Profil
  • App-Routen in der Regel strenger als Marketing-Seiten

13) Testing und Monitoring als Betriebsstandard

Einmal setzen reicht nicht. Security Header brauchen laufende Verifikation, sonst schleichen sich Ausnahmen und Regressionen über Releases wieder ein.

  • Schnelltests per curl -I und DevTools in jeder Release-Routine
  • Automatisierte Header-Checks in CI/CD
  • CSP-Reports laufend auswerten und clustern
  • Scanner/Evaluator regelmäßig zur Policy-Qualität nutzen

14) Typische Stolperfallen und wie Teams sie lösen

Die häufigsten Probleme sind fast immer operativ: zu viele Inline-Skripte, unkontrollierte Third-Party-Integrationen, veraltete Reporting-Konfiguration oder überhastetes Preload.

  • Inline-Skripte schrittweise auf Nonce/Hash umstellen
  • Third-Party nur dort erlauben, wo echter Business-Wert entsteht
  • Reporting-Endpunkte modern und kompatibel aufsetzen
  • HSTS preload erst nach vollständiger HTTPS-Reife
  • COEP/COOP nur mit bewusstem Kompatibilitätsmanagement

15) Copy-Paste Checkliste für eure Definition of Done

Diese Liste funktioniert als belastbarer Mindeststandard für moderne Websites und verhindert die häufigsten Sicherheitslücken auf Header-Ebene.

  • HTTPS überall plus Redirect von HTTP auf HTTPS
  • HSTS gesetzt, preload nur nach bewusster Freigabe
  • X-Content-Type-Options: nosniff aktiv
  • Referrer-Policy explizit gesetzt
  • Permissions-Policy mit sicheren Defaults
  • CSP mit object-src 'none' und base-uri 'none'
  • frame-ancestors passend zur Einbettungsstrategie
  • X-XSS-Protection auf 0
  • CSP-Rollout über Report-Only gestartet und ausgewertet
  • Regelmäßige technische Verifikation im Release-Prozess

FAQ: Brauche ich X-Frame-Options noch, wenn frame-ancestors gesetzt ist?

frame-ancestors in CSP ist der modernere und flexiblere Mechanismus. X-Frame-Options kann zusätzlich als Legacy-Backstop sinnvoll sein, ist aber nicht die primäre Steuerung.

FAQ: Warum setze ich X-XSS-Protection auf 0?

Der Header ist veraltet und in modernen Browsern keine verlässliche Schutzstrategie. Sinnvoller ist eine saubere CSP plus robuste Input- und Output-Sicherheit im Code.

FAQ: Wie führe ich CSP ein, ohne die Seite zu brechen?

Starte mit Report-Only, sammle und priorisiere Violations, schärfe dann die Policy und schalte erst danach auf Enforce. So bleibt der Rollout kontrollierbar.

FAQ: Was ist strict CSP in einem Satz?

Eine CSP, die Script-Ausführung über Nonce- oder Hash-basierte Vertrauensanker steuert statt über breite Domain-Allowlist-Logik.

FAQ: Wann sollte ich COOP/COEP/CORP aktivieren?

Wenn du gezielt Cross-Origin-Isolation brauchst und deine externen Ressourcen technisch sauber kontrollierst. Für klassische Marketingseiten ist das oft unnötig und fehleranfällig.

Abschluss: Security Header als verlässlicher Betriebsstandard

Ein gutes Header-Setup ist kein einmaliges To-do, sondern ein Wartungsstandard: Baseline global setzen, CSP pro Seitentyp pflegen, Reports aktiv auswerten und Policies mit jeder Produktänderung mitführen.

So erhöhst du Sicherheit messbar, ohne Produktteams mit unnötigem Breakage oder Security-Theater auszubremsen.

Quellen

Mehr Insights

Passende Leistungen

Autor

Michael Reimer

Entwickler und Produktbetreiber hinter Reimcode

Michael Reimer entwickelt, veröffentlicht und betreibt eigene Apps und Webprodukte und bringt diese Erfahrung in Kunden- und Agenturprojekte ein.

Mehr über mich

Nächster Schritt

CSP und Security Header sauber einführen?

Ich richte Security Header und CSP kontrolliert ein – mit schrittweiser Einführung, Auswertung und klaren Schutzregeln für Produkt und Marketing.