X-Content-Type-Options fehlt

Worum es geht

Der Header X-Content-Type-Options: nosniff sagt dem Browser „halte dich an den Content-Type, errate ihn nicht anhand des Dateiinhalts“. Ohne ihn untersuchen Browser (historisch vor allem der Internet Explorer, heute auch andere) die ersten paar Bytes und entscheiden selbst.

Warum das ein Problem ist

Standardszenario — ein Nutzer lädt ein Bild auf Ihre Website hoch. Statt eines echten Bildes lädt ein Angreifer eine Datei cat.jpg hoch, die intern HTML mit einem <script> enthält. Der Server kennzeichnet sie sinnvollerweise als image/jpeg. Doch ohne nosniff untersucht der Browser den Inhalt, erkennt HTML und führt diese cat.jpg als Seite aus. Hochgeladenes XSS.

Zweites Szenario — eine CSS-Datei, in die der Angreifer HTML eingeschleust hat, beginnt der Browser „sinnvollerweise“ zu rendern. nosniff macht damit Schluss.

Wie man es behebt

Trivial. Der einzige Wert ist nosniff.

nginx:

add_header X-Content-Type-Options "nosniff" always;

Apache:

Header always set X-Content-Type-Options "nosniff"

WordPress (functions.php / mu-plugin):

add_action('send_headers', function () {
    header('X-Content-Type-Options: nosniff');
});

Cloudflare: Rules → Transform Rules → HTTP Response Header Modification → Header hinzufügen.

Was schiefgehen kann

Praktisch nichts. nosniff erzwingt nur den korrekten Content-Type — wenn Ihr Server für .css-Dateien Content-Type: text/css sendet, ist alles in Ordnung. Ein Problem entstünde nur, wenn Ihr Server CSS mit Content-Type: text/plain sendete — dann würde der Browser es nicht mehr rendern. Falls Sie darauf stoßen, beheben Sie Ihr eigenes MIME-Mapping, nicht den Header.

Überprüfung

curl -I https://example.cz | grep -i content-type-options

Referenzen