missing-x-content-type-options
X-Content-Type-Options nicht gesetzt
Ohne diese kleine Anweisung kann der Browser im Einzelfall raten, dass eine ausgelieferte Datei (etwa ein hochgeladenes Bild) eigentlich ein Skript ist, und sie ausführen. Der Fix ist eine Zeile.
Worum es geht
Schickt Ihr Server eine Datei an den Browser, kennzeichnet er sie mit dem Dateityp (Bild, Text, PDF, JavaScript usw.). Browser vertrauen diesem Label per Default nicht vollständig: passt der Inhalt nicht zum Label, raten sie nach und klassifizieren um. Das nennt sich MIME-Sniffing.
Klingt harmlos, ist es nicht immer. Erlaubt Ihre Seite Datei-Uploads
(Avatare, Anhänge, als Text dargestellte Kommentare) und liefert sie
zurück, kann ein Angreifer eine Datei bauen, die wie ein normales
Bild aussieht und gleichzeitig als ausführbarer Code parst. Ohne
die Anweisung X-Content-Type-Options: nosniff kann der Browser
entscheiden, sie sehe eher wie Code aus, und sie als solchen
ausführen.
Ihre Seite schickt die nosniff-Anweisung derzeit nicht.
Warum das wichtig ist
Zwei praktische Szenarien:
- Hochgeladene Inhalte. Profilbilder, Anhänge, hochgeladene SVG-Logos. Liefert Ihre Seite die aus Ihrer Domain aus, kann ein Angreifer mit einer manipulierten Datei dafür sorgen, dass sein Code im Browser des nächsten Besuchers läuft.
- Logs und ungewöhnliche Dateien. Klartext-Dateien mit bestimmten Byte-Mustern können in älteren Browsern ebenfalls umklassifiziert werden. Heute seltener, aber noch immer ein Sonderfall.
Der Fix hat auf einer sauber konfigurierten Seite null
Nebenwirkungen. Sollte Ihre Seite tatsächlich darauf angewiesen sein,
dass der Browser Dateitypen rät, ist das ein separater Bug;
nosniff sagt dem Browser einfach, Ihren Labels zu vertrauen.
So beheben Sie das
Eine einzelne Anweisung auf jede Antwort hängen. Wer Ihren Webserver verwaltet, setzt das in einer Zeile:
nginx:
add_header X-Content-Type-Options nosniff always;
Apache:
Header always set X-Content-Type-Options nosniff
Caddy:
header X-Content-Type-Options nosniff
Mit curl -I https://ihre-domain.de/ prüfen; der Header sollte in
der Ausgabe erscheinen.
Wenn Sie schon dabei sind, lohnt ein Blick auf die Datei-Upload-Auslieferung:
- Hochgeladene Dateien aus einer separaten Subdomain ausliefern,
falls das Risiko es rechtfertigt (
uploads.ihre-domain.destatt der Hauptdomain). Andere Subdomain = keine geteilten Cookies = ein Angreifer erreicht den Rest Ihrer Seite nicht, selbst wenn eine Schutzschicht versagt. - Expliziten Content-Type und
Content-Disposition: attachmentfür Uploads setzen, sofern es nicht ein Dateityp ist, den Sie bewusst inline anzeigen wollen.