MIME-Sniffing und X-Content-Type-Options: nosniff erklärt
Browser können den tatsächlichen Inhalt einer Antwort "erschnüffeln", um zu entscheiden, wie damit umzugehen ist, auch wenn dein Server den falschen Content-Type sendet. Der Header X-Content-Type-Options: nosniff weist den Browser an, dem deklarierten Typ zu vertrauen und abzulehnen, Dateien — wie ein hochgeladenes Bild — zu einem ausführbaren Skript hochzustufen.
Was es ist
MIME-Sniffing ist eine Browser-Heuristik, die die ersten Bytes einer Antwort prüft, um deren Content-Type zu ermitteln, wenn der Header des Servers fehlt oder nicht mit dem Inhalt übereinstimmt. Beispielsweise könnte eine als text/plain deklarierte Datei, die mit <script> beginnt, als HTML umklassifiziert und ausgeführt werden.
X-Content-Type-Options ist ein Antwort-Header mit einem einzigen Wert: X-Content-Type-Options: nosniff. Wenn er vorhanden ist, weigern sich Browser, eine Antwort in einen anderen MIME-Typ hochzustufen — eine als application/octet-stream bereitgestellte hochgeladene Datei bleibt binär und wird niemals zu einem ausführbaren Skript.
Warum es wichtig ist
Nutzergenerierte Inhalte sind das Hauptrisiko. Wenn deine App Datei-Uploads erlaubt und diese vom selben Origin wie deine App bereitstellt, kann eine als Bild getarnte bösartige HTML-Datei in den Browsern der Opfer ausgeführt werden — ein gespeichertes XSS per Datei-Upload, selbst wenn du Dateiendungen serverseitig validierst.
Ohne nosniff können Browser auch Stylesheets aus unerwarteten Quellen ausführen. Ein Stylesheet, das als Skript ausgeführt wird, schafft einen Cross-Origin-Datenexfiltrationsweg in Kombination mit anderen Fehlkonfigurationen. nosniff ist eine kostengünstige, globale Absicherung, die jede Content-Grenze deiner App stärkt.
So behebst du es
Setze X-Content-Type-Options: nosniff in next.config.js, damit er auf alle Antworten angewendet wird, einschließlich API-Routen und statischer Datei-Routen.
// next.config.js
module.exports = {
async headers() {
return [
{
source: "/:path*",
headers: [
{ key: "X-Content-Type-Options", value: "nosniff" },
],
},
];
},
};Füge die Direktive in deinen Server-Block ein, damit sie für alle durch nginx weitergeleiteten Antworten gilt.
add_header X-Content-Type-Options "nosniff" always;nosniff ist am wirksamsten, wenn jede Antwort auch einen korrekten Content-Type-Header trägt. Für nutzerhochgeladene Dateien: Bereitstelle sie von einem separaten Origin oder Storage-Domain — nicht demselben Origin wie deine App — damit ein ausgeführtes Skript keine Zugriff auf die Session-Cookies deiner Nutzer hat.
Erweiterungsprüfungen können umgangen werden. Verwende eine Bibliothek wie file-type (npm), um die Magic Bytes der Datei serverseitig zu prüfen, und lehne alles ab, was nicht einer Allowlist sicherer Typen entspricht.
import { fileTypeFromBuffer } from "file-type";
const ALLOWED = new Set(["image/jpeg", "image/png", "image/webp", "image/gif"]);
async function validateUpload(buffer: Buffer): Promise<void> {
const type = await fileTypeFromBuffer(buffer);
if (!type || !ALLOWED.has(type.mime)) {
throw new Error("Upload rejected: unsupported file type");
}
}FAQ
Welchen Schweregrad meldet AppSafe für einen fehlenden X-Content-Type-Options-Header?
Mittel. Der Header ist eine einfache Härtungsmaßnahme — eine Zeile Konfiguration —, daher ist das Weglassen eine klare Lücke, aber aktive Ausnutzung erfordert einen separaten Upload- oder Injection-Vektor.
Beeinträchtigt nosniff normale Seitenladevorgänge?
In der Praxis nicht. nosniff blockiert nur die Hochstufung zu einem gefährlicheren Typ. Dein HTML, CSS und JavaScript werden bereits mit den richtigen Typen bereitgestellt und laden normal.
Ist X-Content-Type-Options noch relevant, da moderne Browser intelligenter sind?
Ja. Das Sniffing-Verhalten variiert zwischen Engines und Versionen, und der Header ist die einzige portable Garantie. Alle aktuellen Browser (Chrome, Firefox, Safari, Edge) respektieren nosniff.
Ist deine App betroffen?
AppSafe prüft dies und Dutzende weitere Probleme in einem kostenlosen Scan.
Meine App gratis scannenVerwandte Guides
Content-Security-Policy (CSP): was sie ist und wie du eine hinzufügst
Der Header, der verhindert, dass eingeschleuste Skripte ausgeführt werden.
Clickjacking und X-Frame-Options: halte deine Seiten aus iframes heraus
Ein Header hindert Angreifer daran, deine App in einem iframe zu überlagern.
Offene Verzeichnis-Indizes: wenn dein Dateiserver alles auflistet
Ein Dateiserver, der seinen Inhalt auflistet, liefert Angreifern ein kostenloses Inventar.