HTTP-Security-Header Checkliste (mit Konfigurationen zum Kopieren)
Ein paar Response-Header blockieren ganze Angriffsklassen – Clickjacking, MIME-Sniffing, Protokoll-Downgrades und einen großen Teil von XSS – und kosten fast nichts. Hier sind die Header, die sich lohnen, sichere Startwerte und wie du den kniffligen Kandidaten (CSP) einführst, ohne deine Seite zu zerschießen.
Die Checkliste
| Header | Sicherer Wert | Schützt vor |
|---|---|---|
Strict-Transport-Security | max-age=31536000; includeSubDomains | HTTPS-Downgrade und Cookie-Diebstahl im öffentlichen WLAN |
Content-Security-Policy | Zuerst im Report-Only-Modus starten (siehe unten) | XSS, eingeschleuste Skripte, Datenabfluss |
X-Content-Type-Options | nosniff | Browser, die Uploads als Skripte ausführen |
CSP frame-ancestors | 'self' (oder X-Frame-Options: SAMEORIGIN) | Clickjacking |
Referrer-Policy | strict-origin-when-cross-origin | Weitergabe vollständiger URLs (Tokens, IDs) an andere Seiten |
Permissions-Policy | camera=(), microphone=(), geolocation=() | Drittanbieter-Skripte, die Gerätefunktionen nutzen |
Welche dieser Header deine Seite aktuell sendet und welche Note sie bekommt, siehst du im Security Headers Checker.
HSTS: klein anfangen
Sobald ein Browser HSTS sieht, verweigert er reines HTTP für die gesamte max-age-Laufzeit. Stelle vorher sicher, dass jede Subdomain über HTTPS funktioniert (Zertifikate prüfst du mit dem SSL Checker), starte mit max-age=300 und erhöhe den Wert dann auf ein Jahr. Füge preload hinzu und trage dich erst in die HSTS-Preload-Liste ein, wenn du sicher bist – das Entfernen dauert Monate.
Content-Security-Policy, ohne dass etwas kaputtgeht
CSP legt fest, woher Skripte, Styles, Bilder und Verbindungen stammen dürfen. Führe sie im Report-Only-Modus ein, der Verstöße protokolliert, aber nichts blockiert:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; report-uri /csp-report
Beobachte eine Woche lang die Browser-Konsole und deinen Report-Endpunkt, ergänze die Quellen, die du wirklich nutzt, und ändere dann den Header-Namen in Content-Security-Policy. Verzichte bei Skripten auf 'unsafe-inline'; nutze für eigene Inline-Skripte stattdessen Nonces oder Hashes. Baue die Richtlinie Quelle für Quelle mit dem CSP Generator.
Konfigurationen
Nginx (innerhalb von server; always sorgt dafür, dass die Header auch auf Fehlerseiten erhalten bleiben):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "frame-ancestors 'self'" always;
Apache (.htaccess, mit mod_headers):
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Vercel (vercel.json):
{ "headers": [ { "source": "/(.*)", "headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
] } ] }
Vollständige Server-Konfigurationen erstellst du mit dem Nginx Config Generator oder dem .htaccess Generator.
Header, die du weglassen kannst
X-XSS-Protection ist veraltet – moderne Browser haben den Filter, den er steuerte, entfernt, und 0 ist der empfohlene Wert, falls du ihn überhaupt noch sendest. Expect-CT ist abgekündigt. Das Ausblenden von Server und X-Powered-By ist gute Hygiene, bietet aber keinen echten Schutz.