Security Header

X-Content-Type-Options im Detail: Schutz vor MIME-Sniffing

Der HTTP-Response-Header X-Content-Type-Options ist eine einfache, aber äusserst effektive Schutzmassnahme zur Absicherung von Webanwendungen. Mit der standardisierten Anweisung nosniff wird der Webbrowser angewiesen, das automatische Erraten von Dateitypen (sogenanntes MIME-Sniffing) zu unterlassen. Der Browser wird gezwungen, sich strikt an den vom Webserver übermittelten Content-Type-Header zu halten, was Cross-Site Scripting (XSS) und Drive-by-Downloads verhindert.

Der Header gehört zu den Grundpfeilern jeder Security-Header-Checkliste und entfaltet seine volle Wirkung erst im Verbund mit einer Content-Security-Policy. Während die CSP regelt, woher Skripte stammen dürfen, stellt nosniff sicher, dass eine als Bild getarnte Datei niemals als Skript interpretiert wird.

Das Risiko: Missbrauch durch MIME-Sniffing

Historisch wurden Browser so entwickelt, dass sie möglichst fehlertolerant arbeiten. Setzte ein Webserver beim Ausliefern eines Bildes fälschlicherweise den Header Content-Type: text/plain, las der Browser die Dateistruktur (die ersten Bytes) aus, erkannte das Bildformat und renderte es trotzdem.

Dieses Verhalten birgt erhebliche Sicherheitsrisiken bei B2B-Plattformen mit Benutzer-Uploads:

  1. Der Angriff: Ein Angreifer benennt ein bösartiges HTML-Skript (das z. B. Session-Cookies stiehlt) in avatar.jpg um und lädt es als angebliches Profilbild hoch.
  2. Die Auslieferung: Der Server liefert die Datei als statisches Asset mit dem Header Content-Type: image/jpeg aus.
  3. Die Ausnutzung: Führt der Browser des Opfers nun MIME-Sniffing durch, analysiert er die Datei, überschreibt die JPEG-Anweisung des Servers, weil er HTML-Code findet, und führt das schadhafte Skript im Sicherheitskontext der Website aus (Cross-Site Scripting).

Die Lösung: X-Content-Type-Options: nosniff

Durch das Setzen des Headers zwingen Sie den Browser, jegliches MIME-Sniffing zu unterlassen:

X-Content-Type-Options: nosniff

Die Auswirkungen von nosniff:

  • Strikte Einhaltung: Der Browser weigert sich, eine Datei anders zu interpretieren, als es der Content-Type-Header vorschreibt. Ein Bild mit HTML-Inhalt wird starr als fehlerhaftes Bild interpretiert und nicht als Skript ausgeführt.
  • Skript-Blockierung: Browser blockieren das Laden von JavaScript-Dateien (z. B. via <script src="...">), wenn diese vom Server nicht mit einem gültigen JavaScript-MIME-Typen (wie text/javascript oder application/javascript) ausgeliefert werden. Dies verhindert, dass Angreifer Stylesheets oder Bilder als getarnte Skripte nachladen.

Einordnung: nosniff im Verbund der Security Header

X-Content-Type-Options ist nur ein Baustein. Erst das Zusammenspiel mehrerer Header bildet eine robuste Verteidigung:

HeaderSchützt vorEmpfohlener Wert
X-Content-Type-OptionsMIME-Sniffing, getarnten Skriptennosniff
Content-Security-PolicyCross-Site Scripting (XSS)restriktive Quellenliste
X-Frame-OptionsClickjackingDENY oder SAMEORIGIN
HSTSProtokoll-Downgrademax-age=63072000

Die Tabelle macht deutlich: Kein einzelner Header genügt – jeder deckt einen anderen Angriffsvektor ab. Sicherheitsorganisationen wie das OWASP führen nosniff deshalb als Pflichtbestandteil jeder Basis-Härtung. Der Header ist seit Internet Explorer 8 (2008) etabliert und wird heute von sämtlichen relevanten Browsern unterstützt – es gibt also keinen Grund, ihn wegzulassen.

Ein weiterer Vorteil: nosniff wirkt rein clientseitig und benötigt keine Anpassung des Anwendungscodes. Es genügt eine einzige Zeile in der Server- oder CDN-Konfiguration, um den Schutz site-weit zu aktivieren – ein klassischer Quick-Win mit hohem Sicherheitsgewinn bei minimalem Aufwand.


Server-Konfiguration

Der Header lässt sich mit einer einzigen Zeile in der Webserver-Konfiguration hinterlegen:

  • Nginx: add_header X-Content-Type-Options "nosniff" always;
  • Apache: Header always set X-Content-Type-Options "nosniff"

Für Node.js/Express setzt das verbreitete Paket Helmet den Header automatisch:

  • Express (Helmet): app.use(helmet.noSniff());

Beispiel: vollständige Härtungs-Antwort

In der Praxis erscheint nosniff selten allein, sondern als Teil eines gehärteten Header-Sets:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=63072000; includeSubDomains
Content-Security-Policy: default-src 'self'

Welche dieser Header Ihre Anwendung bereits ausliefert und welche fehlen, fasst die Security-Header-Checkliste systematisch zusammen.

[!TIP] Die nosniff-Anweisung ist eine der am einfachsten umzusetzenden Härtungsmassnahmen für Webserver und sollte auf jeder Website standardmässig aktiv sein. Prüfen Sie, ob Ihre Website nosniff ausgibt, mit dem Security Header Check auf balou.tools.

Häufig gestellte Fragen (FAQ)

Was ist MIME-Sniffing?

MIME-Sniffing beschreibt ein Browserverhalten. Wenn ein Server eine Datei unvollständig deklariert, analysiert der Browser die ersten Bytes der Datei, um den Dateityp selbst zu erraten, anstatt dem HTTP-Header zu vertrauen.

Gibt es andere Werte für diesen Header ausser „nosniff“?

Nein. Der einzige standardisierte und sinnvolle Wert für diesen Header lautet `nosniff`.

Ersetzt X-Content-Type-Options eine Content-Security-Policy?

Nein, beide ergänzen sich. `X-Content-Type-Options: nosniff` verhindert, dass der Browser den Dateityp errt und getarnte Skripte ausführt. Eine Content-Security-Policy steuert dagegen, aus welchen Quellen Skripte überhaupt geladen werden dürfen. Erst zusammen bilden sie eine wirksame Verteidigung gegen Cross-Site Scripting.

Hat nosniff Nebenwirkungen auf legitime Inhalte?

In sauber konfigurierten Anwendungen praktisch nicht. Probleme treten nur auf, wenn der Server falsche oder fehlende Content-Type-Header sendet – etwa eine JavaScript-Datei als `text/plain`. Dann blockiert der Browser die Ressource zu Recht. Die Lösung ist nicht, nosniff zu entfernen, sondern den korrekten MIME-Typ zu setzen.