Zum Hauptinhalt springen

HTTP-Sicherheits-Header weisen den Browser an, bestimmte Angriffe zu blockieren. Sie kosten nichts, sind schnell umgesetzt und reduzieren die Wirkung von XSS, Clickjacking und Downgrade-Angriffen.

Die wichtigsten Header

Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cross-Origin-Opener-Policy: same-origin
  • HSTS: Erzwingt HTTPS. Erst mit kurzem max-age testen, includeSubDomains nur, wenn wirklich alle Subdomains HTTPS können. preload ist faktisch nicht mehr rückgängig zu machen.
  • X-Frame-Options bzw. CSP frame-ancestors: Schutz vor Clickjacking. WordPress setzt für Admin und Login bereits SAMEORIGIN.
  • X-XSS-Protection ist veraltet und kann weggelassen werden.

Content Security Policy (CSP)

Die CSP ist der wirksamste, aber auch anspruchsvollste Header. Sie legt fest, von wo Skripte, Styles, Bilder usw. geladen werden dürfen. WordPress, Page-Builder und viele Plugins setzen Inline-Skripte ein, deshalb ist eine strikte CSP oft schwer umzusetzen.

Vorgehen:

  1. Mit Content-Security-Policy-Report-Only starten und Verstösse sammeln (z. B. über einen Report-Endpunkt oder Dienste wie report-uri.com).
  2. Quellen inventarisieren (Analytics, Fonts, Embeds, CDN, Zahlungsanbieter).
  3. Pragmatische Policy durchsetzen und schrittweise verschärfen.
Content-Security-Policy:
  default-src 'self';
  script-src 'self' 'unsafe-inline' https://www.googletagmanager.com;
  style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
  font-src 'self' https://fonts.gstatic.com;
  img-src 'self' data: https:;
  connect-src 'self';
  frame-ancestors 'self';
  base-uri 'self';
  form-action 'self';
  object-src 'none';
  upgrade-insecure-requests

Auch eine CSP mit 'unsafe-inline' bringt etwas: object-src, base-uri, form-action und frame-ancestors schliessen wichtige Lücken, und connect-src erschwert das Exfiltrieren von Daten durch Skimmer. Der Goldstandard sind Nonces oder Hashes statt 'unsafe-inline'; WordPress unterstützt das mit wp_get_inline_script_tag() und dem Filter wp_inline_script_attributes.

Wo setzen?

  • Webserver (empfohlen): add_header … always; in Nginx, Header always set … in Apache.
  • CDN/Edge (Cloudflare Transform Rules).
  • PHP über den Hook send_headers. Greift nicht für statische Dateien und nicht für Seiten aus dem Page-Cache, wenn dieser die Header nicht speichert.

Prüfen

securityheaders.com und das Mozilla HTTP Observatory bewerten die Konfiguration. Danach Frontend, Admin, Block-Editor, Checkout und Formulare gründlich testen und in der Browser-Konsole auf CSP-Verstösse achten.

Weiterführende Artikel

Quellen und Dokumentation