HTTP-Security-Header prüfen
Was jeder Header bewirkt, was deiner tatsächlich sagt und welche Zeile fehlt. Ohne Schulnote.
Womit anfangen, wenn Sie anfangen
Die Header sind weder gleich wertvoll noch gleich riskant im Einsatz. In der Reihenfolge, die den meisten Schutz bei der geringsten Chance bietet, etwas kaputtzumachen:
| Header | Verhindert | Risiko, etwas zu zerstören |
|---|---|---|
Strict-Transport-Security | HTTPS-Downgrade beim ersten Besuch | Keines, wenn Sie ohnehin nur HTTPS ausliefern |
X-Content-Type-Options | MIME-Sniffing bei Uploads | In der Praxis keines |
Referrer-Policy | Weitergabe von URLs an Dritte | Gering — kann die Zuordnung in der Analytik beeinflussen |
X-Frame-Options / frame-ancestors | Clickjacking | Gering, sofern Sie niemand rechtmäßig einbettet |
Permissions-Policy | Eingebettete Frames, die Kamera oder Standort anfordern | Gering |
Content-Security-Policy | Ausführung eingeschleuster Skripte | Hoch. Erst im Nur-Melden-Modus. |
Die letzte Zeile ist die wichtigste und die einzige, die echte Arbeit macht. Alles darüber ist ein Nachmittag.
HSTS und die eine unumkehrbare Entscheidung darin
Strict-Transport-Security weist einen Browser an, für diesen Host die nächsten max-age Sekunden HTTPS zu verwenden, komme was wolle. Damit schließt es eine schmale, aber reale Lücke: Wer example.com eintippt, sendet vor Ihrer Weiterleitung eine Klartextanfrage, und die lässt sich abfangen.
Strict-Transport-Security: max-age=31536000; includeSubDomainsincludeSubDomains zählt mehr, als es aussieht. Ohne es kann eine über HTTP ausgelieferte Subdomain weiterhin Cookies für die übergeordnete Domain setzen. Mit ihm muss jede Subdomain ausschließlich HTTPS sprechen, sonst wird sie unerreichbar — prüfen Sie also, bevor Sie es hinzufügen.
Über die Direktive preload sollte man gründlich nachdenken. Sie trägt Ihre Domain in die mit Browsern ausgelieferten Preload-Listen ein, HTTPS wird also erzwungen, bevor überhaupt die erste Anfrage stattfindet. Sie ist zugleich faktisch unumkehrbar: Eine Entfernung erfordert einen Antrag bei den Listenpflegern und dann das Warten auf Browser-Releases, also Monate. Ausgezeichnet, wenn Sie sicher sind; schlecht, um es nebenbei zu setzen.
CSP: Der Nur-Melden-Modus ist nicht optional
Eine Content-Security-Policy ist der einzige Header hier, der eingeschleustes Skript am Laufen hindert, und der einzige, der Ihre Seite lahmlegen kann. Beides folgt aus derselben Eigenschaft: Sie schränkt ein, was geladen werden darf.
Setzen Sie sie im Nur-Melden-Modus mit einem Sammler ein und lassen Sie sie ein paar Wochen echten Verkehr laufen. Was Sie finden, ist nicht das, was das Lesen des Codes vermuten ließ: ein vergessener Schrifthost, ein Zahlungs-iframe und häufig ein Skript, das am CDN-Rand eingeschleust wird und in keiner Quelldatei auftaucht. Genau diese letzte Kategorie soll der Nur-Melden-Modus sichtbar machen.
Content-Security-Policy-Report-Only: default-src 'self';
script-src 'self'; object-src 'none'; base-uri 'self';
report-uri /csp-reportZwei Dinge machen den Nutzen weitgehend zunichte. 'unsafe-inline' in script-src erlaubt exakt das eingeschleuste Inline-Skript, das die Richtlinie verhindern soll — Nonces oder Hashes sind der Ausweg. Und 'unsafe-eval' schaltet eval und Verwandtes wieder frei, was manche ältere Framework-Builds noch brauchen. Der Prüfer markiert beides als Schwächung statt als Fehlen, denn eine Richtlinie mit ihnen leistet immer noch Nützliches; nur eben nicht die Hauptaufgabe.
Header, deren Empfehlung abgelaufen ist
- `X-XSS-Protection` — steuerte einen Browserfilter, der aus allen großen Browsern entfernt wurde und sich seinerzeit selbst so manipulieren ließ, dass er Seiten zerstörte. Kein Header, den man 2026 setzt.
- `Expect-CT` — überholt. Certificate Transparency wird inzwischen bedingungslos durchgesetzt, der Header tut also nichts.
- `Feature-Policy` — umbenannt in
Permissions-Policy, mit anderer Syntax. Nur der neue Name wird beachtet. - `Public-Key-Pins` — aus den Browsern entfernt, und zu Recht. Ein Fehler darin legte Ihre Domain für die Dauer der Bindung lahm, ohne jede Möglichkeit zur Erholung.
Was dies nicht prüft
Eine Seite, eine Antwort. Es liest die Header der Endantwort nach dem Verfolgen von Weiterleitungen und hört dort auf. Es durchsucht die Seite nicht, führt kein JavaScript aus, testet Ihre TLS-Konfiguration nicht und prüft keine Cookie-Flags — und verschiedene Pfade derselben Seite können völlig unterschiedliche Header senden, die Startseite zu prüfen sagt Ihnen also etwas über die Startseite.
Für die TLS-Konfiguration im Besonderen ist Qualys SSL Labs das etablierte Werkzeug und gründlich. Für das Zertifikat selbst liest dieses hier, was ein Host tatsächlich vorlegt.
Fragen zu Headern
Warum gibt es keine Note und keine Punktzahl?
Weil eine Note die eine Ausgabe ist, mit der niemand etwas anfangen kann. Zu wissen, dass Sie ein „C“ haben, sagt Ihnen nicht, welcher Header fehlt, warum er für Ihre Seite zählt oder was zu setzen ist — und es verleitet dazu, Header hinzuzufügen, um einen Buchstaben zu heben, statt ein Problem zu lösen. Eine Seite mit strenger CSP und ohne Permissions-Policy steht weit besser da als eine mit sechs Headern auf freizügigen Werten, und kein einzelner Buchstabe kann das ausdrücken. Deshalb wird hier jeder Header einzeln gemeldet, der tatsächlich gesendete Wert beurteilt und die Zeile zum Einfügen mitgeliefert.
Welchen Header sollte ich zuerst setzen?
Strict-Transport-Security, wenn Sie ohnehin nur HTTPS ausliefern. Es ist eine Zeile, kann nichts zerstören, was funktioniert hat, und schließt das Downgrade-Fenster beim ersten Besuch. Danach Content-Security-Policy im Nur-Melden-Modus — die hat echte Zähne, und der Nur-Melden-Modus lässt Sie herausfinden, was Ihre Seite wirklich lädt, bevor Sie irgendetwas erzwingen. X-Content-Type-Options: nosniff kostet ebenfalls nichts und sollte einfach an sein.
Kann eine Content-Security-Policy meine Seite zerstören?
Ohne Weiteres — dafür gibt es den Nur-Melden-Modus. Setzen Sie Content-Security-Policy-Report-Only mit einem Sammler ein, lassen Sie es ein paar Wochen echten Verkehr laufen und lesen Sie die Meldungen: Sie finden vergessene Ressourcen und häufig Dinge, die ein CDN oder ein Analysedienst am Rand einschleust und die in keiner Quelldatei auftauchen. Erzwingen Sie erst, wenn die Meldungen verstummt sind. Eine Richtlinie, die man aus dem Lesen des Quellcodes schreibt und sofort erzwingt, ist die klassische Art, den Bestellvorgang lahmzulegen.
Lohnt es sich, X-XSS-Protection zu setzen?
Nein. Er steuerte einen XSS-Filter im Browser, der aus allen großen Browsern entfernt wurde — Chrome hat ihn 2019 fallen gelassen —, und seinerzeit riss der Filter selbst Lücken auf, weil er sich so manipulieren ließ, dass er nicht verwundbare Seiten zerstörte. Ihn auf 0 zu setzen ist vertretbar, wenn irgendein Scanner darauf besteht; ihn auf 1; mode=block zu setzen wiederholt einen Rat, der vor Jahren abgelaufen ist. Der Ersatz heißt Content-Security-Policy.
Brauche ich X-Frame-Options noch, wenn ich eine CSP habe?
Nein, sofern Ihre CSP frame-ancestors setzt, was ihn in jedem aktuellen Browser ablöst. Dieser Prüfer erkennt das und meldet X-Frame-Options nicht als fehlend, wenn frame-ancestors die Arbeit erledigt. Beides zu behalten kostet nichts und hilft nur bei Browsern, die so alt sind, dass Sie vermutlich größere Sorgen haben.
Bedeutet ein fehlender Header, dass ich verwundbar bin?
Nein. Sicherheitsheader sind gestaffelte Verteidigung — sie begrenzen den Schaden einer Schwachstelle, sie schaffen oder beseitigen keine. Eine Seite ohne CSP ist nicht anfällig für XSS; anfällig ist eine Seite mit einem XSS-Fehler, und die CSP verhindert, dass daraus eine vollständige Übernahme wird. Header hinzuzufügen ist sinnvoll und billig, und es ersetzt weder Ausgabekodierung noch Eingabeprüfung noch aktuelle Abhängigkeiten.
Zuletzt geprüft . Etwas veraltet gefunden? Sagen Sie uns Bescheid.
