Tous les guides
Sévérité MoyenneEn-têtes de sécurité

MIME sniffing et X-Content-Type-Options : nosniff expliqué

Les navigateurs peuvent « flairer » le contenu réel d'une réponse pour décider comment le traiter, même si votre serveur envoie le mauvais Content-Type. L'en-tête X-Content-Type-Options : nosniff indique au navigateur de faire confiance au type déclaré et de refuser de promouvoir des fichiers — comme une image uploadée — en script exécutable.

Ce que c’est

Le MIME sniffing est une heuristique du navigateur qui inspecte les premiers octets d'une réponse pour en déduire le type de contenu quand l'en-tête Content-Type du serveur est absent ou ne correspond pas au contenu. Par exemple, un fichier déclaré text/plain qui commence par <script> pourrait être reclassifié et exécuté comme du HTML.

X-Content-Type-Options est un en-tête de réponse à valeur unique : X-Content-Type-Options : nosniff. Lorsqu'il est présent, les navigateurs refusent de promouvoir une réponse vers un type MIME différent — un fichier uploadé servi en application/octet-stream reste binaire et ne devient jamais un script ou une feuille de style exécutable.

Pourquoi ça compte

Le contenu généré par les utilisateurs est le principal risque. Si votre application permet l'upload de fichiers et les sert depuis la même origine que l'application, un fichier HTML malveillant déguisé en image peut s'exécuter dans les navigateurs des victimes — un XSS stocké via upload, même si vous validez les extensions côté serveur.

Sans nosniff, les navigateurs peuvent aussi exécuter des feuilles de style récupérées depuis des sources inattendues. Une feuille de style exécutée comme un script crée un vecteur d'exfiltration de données cross-origin combiné à d'autres mauvaises configurations. nosniff est une protection globale peu coûteuse qui renforce chaque frontière de contenu de votre application.

Comment corriger

Ajouter l'en-tête globalement dans Next.js

Définissez X-Content-Type-Options : nosniff dans next.config.js pour qu'il s'applique à toutes les réponses, y compris les routes API et les routes de fichiers statiques.

// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: "/:path*",
        headers: [
          { key: "X-Content-Type-Options", value: "nosniff" },
        ],
      },
    ];
  },
};
Le configurer dans nginx

Ajoutez la directive dans votre bloc server pour qu'elle s'applique à toutes les réponses passant par nginx.

add_header X-Content-Type-Options "nosniff" always;
Toujours déclarer un Content-Type précis

nosniff est plus efficace quand chaque réponse porte également un en-tête Content-Type correct. Pour les fichiers uploadés par les utilisateurs, servez-les avec un type approprié et depuis une origin ou un domaine de stockage séparé — pas la même origin que votre app — afin que même si un fichier s'exécute, il ne puisse pas accéder aux cookies de session de vos utilisateurs.

Valider les uploads par le contenu, pas seulement par l'extension

Les vérifications d'extension peuvent être contournées. Utilisez une bibliothèque comme file-type (npm) pour inspecter les magic bytes du fichier côté serveur et rejetez tout ce qui ne correspond pas à une liste de types sûrs autorisés.

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

Quelle sévérité AppSafe signale-t-il pour un en-tête X-Content-Type-Options absent ?

Moyenne. L'en-tête est une mesure de durcissement à faible friction — une ligne de configuration —, donc l'omettre est une lacune évidente, mais l'exploitation active nécessite un vecteur d'upload ou d'injection séparé.

nosniff affecte-t-il les chargements de page normaux ?

En pratique, non. nosniff bloque uniquement la promotion vers un type plus dangereux. Votre HTML, CSS et JavaScript sont déjà servis avec les bons types et se chargent normalement.

X-Content-Type-Options est-il encore pertinent maintenant que les navigateurs modernes sont plus intelligents ?

Oui. Le comportement de sniffing varie entre les moteurs et les versions, et l'en-tête est la seule garantie portable. Tous les navigateurs actuels (Chrome, Firefox, Safari, Edge) respectent nosniff.

Votre app est-elle concernée ?

AppSafe détecte ce problème et des dizaines d’autres en un seul scan gratuit.

Scanner mon app gratuitement