WebCheck

Sicherheits-Header: nosniff, Referrer-Policy, Permissions-Policy und X-Frame-Options

Neben HSTS und CSP gibt es eine Handvoll kleiner Header, die mit je einer Zeile Konfiguration eine bestimmte Schwachstelle schließen. Andere stehen noch in vielen Vorlagen, obwohl sie längst nichts mehr bewirken.

Stand: 05.11.2026

X-Content-Type-Options

Browser raten bei manchen Antworten, welcher Dateityp wirklich darin steckt. Gefährlich wird dieses MIME-Sniffing, wenn Besucher Dateien hochladen dürfen. Eine angebliche Textdatei mit HTML darin stellt der Browser dann womöglich als Seite dar, samt eingebetteter Skripte.

X-Content-Type-Options: nosniff schaltet das Raten ab. Der Browser nimmt den angegebenen Typ beim Wort, und Skripte oder Stylesheets mit unpassendem Typ blockiert er ganz. Skripte brauchen einen JavaScript-Typ, Stylesheets text/css. Einen anderen Wert als nosniff gibt es nicht.

Fehlt nach dem Einschalten ein Skript, liefert der Server es meist als text/plain oder ohne Typ aus. Korrigier dann den Typ in der Serverkonfiguration und lass den Header stehen.

Referrer-Policy

Folgt ein Besucher einem Link, schickt der Browser im Header Referer mit, von welcher Adresse er kommt. Dasselbe passiert, wenn Deine Seite Bilder, Schriften oder Skripte von fremden Servern lädt. Pfade und Parameter verraten dabei oft mehr als gedacht: Suchbegriffe, Bestellnummern oder den Token aus einem Link zum Zurücksetzen des Passworts.

Ohne eigene Angabe gilt in aktuellen Browsern strict-origin-when-cross-origin (W3C Referrer Policy). Fremde Seiten erfahren dann nur die Origin, also Schema, Host und Port. Ein fehlender Header ist deshalb bei ZwoWebCheck nur ein Hinweis. Setz ihn trotzdem ausdrücklich, denn ältere Browser hatten einen lockereren Standard.

Wert eigene Origin fremde Origin (HTTPS) Ziel über HTTP
no-referrer nichts nichts nichts
same-origin volle Adresse nichts nichts
strict-origin Origin Origin nichts
strict-origin-when-cross-origin volle Adresse Origin nichts
no-referrer-when-downgrade volle Adresse volle Adresse nichts
unsafe-url volle Adresse volle Adresse volle Adresse

Die letzten beiden geben jeder fremden Seite die komplette Adresse mit, unsafe-url sogar unverschlüsselt. ZwoWebCheck bewertet sie als mittel. no-referrer-when-downgrade war bis 2020 Standard in Chrome und steht deshalb noch in alten Anleitungen. Noch strenger als der Standard sind same-origin und no-referrer.

Permissions-Policy

Die Permissions-Policy schaltet Browserfunktionen ab, die Deine Seite nicht braucht, etwa Kamera, Mikrofon oder Standort. Ein Skript, das über einen Tag-Manager oder eine Lücke in die Seite gelangt, kann sie dann nicht mehr anfragen.

Der Header ist ein strukturiertes Feld nach RFC 9651, die Einträge trennt ein Komma. () sperrt eine Funktion für alle, (self) erlaubt sie nur der eigenen Origin, weitere Origins folgen in doppelten Anführungszeichen:

Permissions-Policy: camera=(), microphone=(), geolocation=(self "https://karte.beispiel.de")

Der Vorgänger Feature-Policy hatte eine andere Schreibweise (camera 'none'; microphone 'none'). Landet diese im neuen Header, kann der Browser ihn nicht lesen und verwirft die ganze Policy. Sieh Dir auch kopierte Listen genau an. fullscreen=() etwa nimmt eingebetteten Videos den Vollbildknopf.

Bisher werten nur Chromium-Browser wie Chrome und Edge den Header aus, Firefox und Safari ignorieren ihn. ZwoWebCheck prüft deshalb nur, ob er gesetzt ist, und meldet sein Fehlen als Hinweis.

X-Frame-Options oder frame-ancestors

Was Clickjacking ist, erklärt der Artikel zur CSP. Dagegen gibt es zwei Wege. X-Frame-Options kennt zwei Werte: DENY verbietet jede Einbettung, SAMEORIGIN erlaubt sie nur der eigenen Origin. Mit dem alten Wert ALLOW-FROM ignorieren aktuelle Browser den ganzen Header, ZwoWebCheck zählt ihn dann als fehlend.

Soll ein Partner Deine Seite einbetten dürfen, etwa ein Buchungsformular, brauchst Du frame-ancestors in der CSP. Diese Direktive hat Vorrang, wenn beide gesetzt sind. Für die Bewertung reicht einer der beiden Wege. Keiner wirkt im Meta-Tag, und eine CSP im Report-Only-Modus schützt auch hier nicht.

Cross-Origin-Opener-Policy

Öffnet Deine Seite ein Fenster oder wird sie aus einem geöffnet, behalten beide einen Verweis aufeinander. Darüber kann eine fremde Seite Deine zum Beispiel umleiten. Cross-Origin-Opener-Policy: same-origin kappt diese Verbindung zu fremden Origins. Login- und Zahlungsfenster, die per window.opener zurückmelden, funktionieren dann nicht mehr; same-origin-allow-popups nimmt Fenster aus, die Du selbst öffnest. ZwoWebCheck prüft diesen Header nicht.

Header, die wegkönnen

  • X-XSS-Protection steuerte den XSS-Filter alter Browser. Chrome hat seinen 2019 entfernt, Firefox hatte nie einen. Der Filter ließ sich sogar missbrauchen, um einzelne Skripte einer Seite abzuschalten. Lösch den Header oder setz ihn auf 0.
  • Expect-CT kannten nur Chromium-Browser. Seit Chrome 107 ist er abgekündigt, weil Chrome Certificate Transparency ohnehin für jedes öffentliche Zertifikat verlangt.
  • Public-Key-Pins (HPKP) band eine Domain an bestimmte Schlüssel. Ein Fehler beim Zertifikatswechsel sperrte Besucher aus. Chrome 72 und Firefox 72 haben ihn entfernt. Welche Zertifizierungsstellen ausstellen dürfen, regelt heute CAA.
  • Feature-Policy ist durch die Permissions-Policy ersetzt.

Alles zusammen

Für nginx gehören die Zeilen in den server-Block. Erst always hängt sie auch an Fehlerseiten. Wie add_header in location-Blöcken verloren geht, steht im Artikel zu HSTS.

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;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

Für Apache mit mod_headers im VirtualHost oder in der .htaccess:

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"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"

Typische Fehler

  • Mehrere Werte in falscher Reihenfolge. Referrer-Policy: strict-origin-when-cross-origin, unsafe-url endet bei unsafe-url. Der gewünschte Wert gehört ans Ende, ein Rückfall für ältere Browser davor.
  • Die Header kommen von einem CMS-Plugin statt vom Webserver. Bilder, PDFs und Fehlerseiten bleiben dann ohne.

Sicherheits-Header prüfen

Den Bereich Sicherheits-Header bewertet ZwoWebCheck anhand der Seite, bei der Dein Aufruf nach allen Weiterleitungen ankommt. Neben der CSP bekommen dort nosniff, der Clickjacking-Schutz, die Referrer-Policy und die Permissions-Policy je eine eigene Ampel. Für fehlendes nosniff, fehlenden Clickjacking-Schutz und eine Referrer-Policy, die volle Adressen weitergibt, nennt der Bericht die passende Zeile für Deinen Webserver.