Security-Header erklärt: HSTS, CSP und die anderen
Security-Header sind kurze Anweisungen, die dein Server bei jeder Antwort mitschickt. Sie kosten nichts, verlangsamen nichts und verhindern trotzdem ganze Angriffsklassen. Der Aufwand liegt meist bei wenigen Zeilen in der Serverkonfiguration.
Die vier Kern-Header
| Header | Verhindert | Guter Wert |
|---|---|---|
Strict-Transport-Security |
Herabstufung auf unverschlüsseltes HTTP | max-age=31536000; includeSubDomains |
Content-Security-Policy |
Eingeschleuste Skripte (XSS) | siehe unten — abhängig von der Seite |
X-Frame-Options |
Einbetten in fremde Seiten (Clickjacking) | SAMEORIGIN |
X-Content-Type-Options |
Falsch geratene Dateitypen | nosniff |
Strict-Transport-Security (HSTS)
Tippt jemand deine-seite.de in die Adresszeile, versucht der Browser es zunächst
unverschlüsselt. Diese erste Anfrage lässt sich in einem fremden WLAN abfangen und umleiten —
die Weiterleitung auf HTTPS kommt zu spät. HSTS löst das: Der Browser merkt sich, dass diese Domain
nur über HTTPS erreichbar ist, und ruft sie ab dem zweiten Besuch gar nicht erst unverschlüsselt auf.
Entscheidend ist der Wert, nicht die bloße Anwesenheit des Headers. max-age=300 ist
faktisch wirkungslos — fünf Minuten Schutz. Empfohlen ist ein Jahr:
Strict-Transport-Security: max-age=31536000; includeSubDomains
Vorsicht: Mit includeSubDomains gilt die Vorgabe auch für alle
Unterdomains. Läuft dort etwas noch ohne HTTPS — ein alter Entwicklungsserver etwa —, ist es für
die Dauer von max-age nicht mehr erreichbar. Erst prüfen, dann setzen.
preload nur ergänzen, wenn du dir wirklich sicher bist: Die Eintragung in die
Browser-Vorlagelisten lässt sich nur mit Verzögerung rückgängig machen.
Content-Security-Policy (CSP)
Die CSP legt fest, aus welchen Quellen der Browser überhaupt etwas laden darf. Schafft es Angreifercode in deine Seite — etwa über ein Kommentarfeld —, verhindert eine gute CSP, dass er ausgeführt wird.
Der häufigste Fehler ist eine Policy, die zwar vorhanden, aber wirkungslos ist:
Content-Security-Policy: script-src 'self' 'unsafe-inline'
'unsafe-inline' erlaubt beliebigen Skriptcode direkt im HTML — also genau das, wovor die
CSP schützen soll. In Prüfberichten sieht so eine Seite gut aus, geschützt ist sie nicht.
Wer Inline-Skripte braucht, arbeitet mit einem Nonce: Der Server erzeugt pro Aufruf einen Zufallswert,
schreibt ihn in den Header und in das erlaubte Skript-Tag. Fremder Code kennt den Wert nicht.
Ein brauchbarer Ausgangspunkt für eine einfache Seite:
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'; base-uri 'self'
Vorgehen: Erst mit Content-Security-Policy-Report-Only einsetzen. Der Browser
meldet dann Verstöße in der Entwicklerkonsole, blockiert aber nichts. Wenn nach ein paar Tagen nichts
Relevantes mehr auftaucht, auf den echten Header umstellen.
Die kleineren Header
X-Content-Type-Options: nosniff— verbietet dem Browser, den Dateityp zu raten. Ohne diesen Header kann eine hochgeladene Bilddatei unter Umständen als Skript ausgeführt werden.Referrer-Policy: strict-origin-when-cross-origin— verhindert, dass vollständige URLs samt Parametern an fremde Seiten weitergegeben werden. Auch ein Datenschutzthema.Permissions-Policy: geolocation=(), camera=(), microphone=()— schaltet Browser-Funktionen ab, die deine Seite nicht braucht.
Einrichten
Apache
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
Das always ist wichtig: Ohne dieses Schlüsselwort fehlen die Header bei Fehlerseiten.
nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
nginx-Falle: Sobald in einem location-Block ein einziges
add_header steht, gelten die Header aus dem übergeordneten Block dort nicht mehr.
Sie müssen dann im Unterblock wiederholt werden. Das ist einer der häufigsten Gründe dafür, dass
Header auf der Startseite erscheinen, auf Unterseiten aber fehlen.
WordPress ohne Serverzugriff
Wenn du nicht an die Serverkonfiguration kommst, lassen sich die Header in der .htaccess
im Wurzelverzeichnis setzen — mit demselben Block wie oben. Vorher eine Sicherungskopie anlegen:
Ein Tippfehler in der .htaccess legt die ganze Seite lahm.
Danach prüfen
Header werden erstaunlich oft gesetzt und wirken trotzdem nicht — wegen Zwischenspeichern, wegen eines vorgeschalteten Proxys oder wegen der nginx-Falle. Prüfe deshalb mehrere Unterseiten, nicht nur die Startseite. Apexly bewertet dabei nicht nur, ob ein Header da ist, sondern auch, ob sein Wert tatsächlich schützt.
Häufige Fragen
Welcher Security-Header ist am wichtigsten?
Wenn du nur einen setzen kannst: Strict-Transport-Security. Er ist in einer Zeile erledigt, kann kaum etwas kaputtmachen und verhindert eine ganze Angriffsklasse. Die Content-Security-Policy bringt am meisten, ist aber auch am aufwendigsten.
Kann ein Security-Header meine Website kaputtmachen?
Eine zu strenge Content-Security-Policy kann Skripte blockieren und damit sichtbar Funktionen lahmlegen. Deshalb erst im Report-Only-Modus testen. HSTS ist gefährlich, wenn HTTPS nicht überall funktioniert — Browser merken sich die Vorgabe für die angegebene Dauer. Die übrigen Header sind praktisch risikofrei.
Reicht es, die Header nur auf der Startseite zu setzen?
Nein. Header wirken pro Antwort. Sie gehören in die Serverkonfiguration, damit jede Seite und jede Datei sie mitliefert.
Was ist der Unterschied zwischen X-Frame-Options und frame-ancestors?
Beide verhindern, dass deine Seite in einen fremden Rahmen eingebettet wird. frame-ancestors ist Teil der Content-Security-Policy, moderner und feiner steuerbar. X-Frame-Options ist der ältere Weg. Wer beides setzt, ist auf der sicheren Seite.
Prüf deine Website in 30 Sekunden
Ein Scan pro Tag ist kostenlos — ohne Anmeldung, ohne Installation.
Stand: 1. August 2026. Dieser Text erklärt technische Zusammenhänge und ist keine Rechtsberatung.