StartseiteRatgeber › Security-Header erklärt: HSTS, CSP und die anderen

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

HeaderVerhindertGuter 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

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.