HTTPQUERY
Français

X-Content-Type-Options

Utilisation

Le MIME sniffing est un comportement du navigateur qui consiste à inspecter le contenu d’une réponse et à remplacer le Content-Type déclaré en fonction de motifs trouvés dans le corps de la réponse. Conçu au départ comme une commodité pour les serveurs mal configurés, le MIME sniffing ouvre une faille de sécurité : un attaquant téléverse un fichier déguisé en image, le navigateur détecte le contenu comme du HTML ou du JavaScript, et une attaque de type cross-site scripting s’exécute.

L’en-tête X-Content-Type-Options comble cette faille. Avec la valeur nosniff, le navigateur suit strictement l’en-tête Content-Type et refuse de charger les ressources dont le type déclaré ne correspond pas au type attendu. Pour les destinations de type style, le navigateur bloque la réponse sauf si le Content-Type est text/css. Pour les destinations de type script, le navigateur bloque la réponse sauf si le Content-Type est un type MIME JavaScript valide.

Cet en-tête est largement déployé comme mesure standard de durcissement de la sécurité et il est recommandé aux côtés de Content-Security-Policy et X-Frame-Options dans une logique de défense en profondeur.

nosniff

La valeur nosniff est la seule valeur définie. Définir cette directive empêche le navigateur de détourner une réponse du Content-Type déclaré par MIME sniffing.

Exemple

Un serveur délivrant une réponse d’API JSON avec le MIME sniffing désactivé, garantissant que le navigateur traite strictement la réponse comme du JSON :

Content-Type: application/json
X-Content-Type-Options: nosniff

Un fichier CSS servi avec le bon Content-Type et la protection contre le sniffing, empêchant le navigateur de réinterpréter le fichier :

Content-Type: text/css
X-Content-Type-Options: nosniff

Dépannage

Les ressources bloquées par nosniff produisent des erreurs de console signalant une incohérence de type MIME entre le Content-Type déclaré et le type attendu pour la destination de la ressource.

Script bloqué pour cause de type MIME incohérent. Le navigateur journalise Refused to execute script from ’…’ because its MIME type (‘text/plain’) is not executable. Cela se produit lorsque le serveur envoie un fichier JavaScript avec un Content-Type autre qu’un type MIME JavaScript valide (text/javascript, application/javascript). Corrigez la configuration du serveur. Sous nginx, vérifiez la présence de include mime.types; dans le bloc http. Sous Apache, vérifiez que AddType text/javascript .js figure dans la configuration ou le .htaccess.

CSS non appliqué à cause d’un type MIME erroné avec nosniff. La console affiche Refused to apply style from ’…’ because its MIME type (‘text/html’) is not a supported stylesheet MIME type. Le serveur envoie les fichiers CSS en text/html ou text/plain au lieu de text/css. Sous nginx, ajouter types { text/css css; } ou inclure le fichier mime.types par défaut résout l’incohérence. Sous Apache, ajoutez AddType text/css .css à la configuration du serveur.

Le serveur envoie un Content-Type erroné pour les fichiers statiques. Les serveurs, CDN ou stockages objet (S3, GCS) mal configurés servent souvent les fichiers statiques en application/octet-stream ou text/plain. Vérifiez le Content-Type de chaque ressource via l’onglet Network des DevTools en sélectionnant la requête et en inspectant les en-têtes de réponse. Pour S3, définissez la métadonnée ContentType au téléversement. Pour les ressources servies par un CDN, vérifiez que le serveur d’origine renvoie le bon type, car la plupart des CDN transmettent tel quel le Content-Type de l’origine.

Diagnostiquer les ressources bloquées dans la console des DevTools. Ouvrez l’onglet Console et filtrez sur les erreurs liées au MIME. Chaque message de ressource bloquée indique l’URL, le type MIME déclaré et le type attendu. Recoupez avec l’onglet Network : sélectionnez la requête bloquée, ouvrez le panneau Headers et contrôlez l’en-tête de réponse Content-Type. La correction consiste toujours à rectifier le Content-Type sur le serveur, jamais à retirer l’en-tête nosniff.

Configuration

Appliquez nosniff à toutes les réponses. Le surcoût est négligeable et la protection couvre les scripts, les styles et les autres sous-ressources.

nginx :

add_header X-Content-Type-Options nosniff always;

Apache :

Header always set X-Content-Type-Options nosniff

IIS (web.config) :

<code class="language-xml"><customHeaders>
  <add name="X-Content-Type-Options"
       value="nosniff" />
</customHeaders>