Alle Guides
Schweregrad MittelSicherheits-Header

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

Header global in Next.js hinzufügen

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" },
        ],
      },
    ];
  },
};
In nginx konfigurieren

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;
Immer einen genauen Content-Type deklarieren

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.

Uploads nach Inhalt validieren, nicht nur nach Erweiterung

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 scannen