< 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

Fachinformatiker und Entwickler hinter Reimcode

Michael Reimer entwickelt mit Reimcode Websites, Web-Apps und technische Setups mit Fokus auf saubere Umsetzung, klare Struktur und belastbare Entscheidungen.

Mehr über mich

Nächster Schritt

CSP und Security Header sauber einführen?

Wir setzen ein praxistaugliches Header- und CSP-Setup auf, inklusive Report-Only-Rollout, Monitoring und klaren Guardrails für Produkt und Marketing.