≡En resumen
- El MIME sniffing es la costumbre de los navegadores de adivinar el tipo de un archivo leyendo su contenido.
- Con nosniff, el navegador usa el Content-Type que envía el servidor tal cual, sin adivinar.
- Protege sobre todo a webs que alojan archivos subidos por usuarios frente a ataques XSS.
- Antes de activarla, comprueba que cada recurso se sirve con su tipo MIME correcto, o se bloquearán scripts y estilos.
- Es una de las cabeceras de seguridad básicas, junto a HSTS, CSP, Referrer-Policy y X-Frame-Options.
01 ¿Qué es X-Content-Type-Options?
Forma parte de la familia de cabeceras de seguridad que el servidor añade a cada respuesta, junto con las que activan HTTPS estricto o limitan qué scripts pueden cargarse. Es de las más sencillas de configurar: una línea en el servidor. Por eso aparece en casi todas las auditorías de seguridad web cuando falta.
02 Qué es el MIME sniffing y por qué es un riesgo
Cada archivo que sirve una web viaja con una etiqueta de tipo, el tipo MIME, en la cabecera Content-Type: text/html para páginas, text/css para estilos, image/png para imágenes. Durante años muchos servidores etiquetaban mal los archivos, así que los navegadores aprendieron a «olfatear» (sniff) los primeros bytes para adivinar el tipo real y mostrar el contenido de todos modos.
Esa ayuda tiene un lado oscuro: si un navegador decide que un archivo etiquetado como texto o imagen «parece» HTML o JavaScript, puede ejecutarlo. Un atacante que logre subir un archivo manipulado a tu web puede convertirlo así en un ataque de cross-site scripting (XSS).
| Situación | Sin nosniff | Con nosniff |
|---|---|---|
| Script servido como text/plain | El navegador puede ejecutarlo | Se bloquea: no es un tipo MIME de JavaScript |
| Hoja de estilos servida como text/html | Puede aplicarse | Se bloquea: no es text/css |
| Archivo de texto con HTML dentro | Riesgo de que se interprete como página | Se muestra como texto plano |
| Recurso bien etiquetado | Funciona | Funciona igual |
03 Cómo funciona nosniff exactamente
Según la documentación de MDN, nosniff tiene dos efectos. Primero, bloquea una petición si su destino es un estilo y el tipo MIME no es text/css, o si es un script y el tipo no es un tipo MIME de JavaScript. Segundo, para el resto de respuestas, incluidas las páginas HTML, el navegador usa el Content-Type recibido tal cual, sin examinar el contenido.
HTTP/2 200content-type: text/javascript; charset=utf-8x-content-type-options: nosniff
El navegador ejecuta el script porque el tipo declarado es de JavaScript. Si el mismo archivo llegara como text/plain, lo rechazaría y verías un error en la consola.
| Archivo | Tipo MIME correcto |
|---|---|
| .js y .mjs | text/javascript |
| .css | text/css |
| .json | application/json |
| .svg | image/svg+xml |
| .webp | image/webp |
| .woff2 | font/woff2 |
04 Cómo añadir X-Content-Type-Options en Apache, Nginx, IIS y PHP
Apache (.htaccess o virtual host, con mod_headers activo):Header always set X-Content-Type-Options "nosniff"
Nginx (bloque server):add_header X-Content-Type-Options "nosniff" always;
IIS (web.config, dentro de system.webServer):<httpProtocol><customHeaders><add name="X-Content-Type-Options" value="nosniff" /></customHeaders></httpProtocol>
PHP (antes de enviar cualquier salida):header('X-Content-Type-Options: nosniff');
-
1
Revisa los tipos MIME
Comprueba que JavaScript, CSS, fuentes e imágenes se sirven con su Content-Type correcto.
-
2
Añade la cabecera en el servidor
En un servidor Apache, en Nginx o en tu CDN, para que afecte a todas las respuestas.
-
3
Evita duplicarla
Si la aplicación o un plugin ya la envía, no la repitas en el servidor.
-
4
Prueba la web completa
Navega por las plantillas principales con la consola abierta: un script bloqueado aparece como error de tipo MIME.
-
5
Verifica la respuesta
Con curl -I https://tudominio.com o en la pestaña Red de las herramientas de desarrollo.
05 X-Content-Type-Options y el resto de cabeceras de seguridad
La hoja de referencia de cabeceras HTTP de OWASP recomienda enviar X-Content-Type-Options: nosniff y, a la vez, declarar correctamente el Content-Type en todo el sitio. Estas son las cabeceras con las que suele ir acompañada:
| Cabecera | Para qué sirve | Valor recomendado por OWASP |
|---|---|---|
| X-Content-Type-Options | Desactivar el MIME sniffing | nosniff |
| Strict-Transport-Security (HSTS) | Forzar HTTPS en visitas futuras | max-age=63072000; includeSubDomains; preload |
| Content-Security-Policy | Limitar de dónde se cargan scripts y recursos | Política a medida de cada web |
| X-Frame-Options | Impedir que te incrusten en iframes (clickjacking) | DENY |
| Referrer-Policy | Controlar qué URL de origen se comparte | strict-origin-when-cross-origin |
| X-XSS-Protection | Filtro XSS antiguo de algunos navegadores | 0 u omitirla; usar CSP en su lugar |
Para ver qué cabeceras envía hoy tu servidor, sigue los pasos para analizar las cabeceras HTTP de tu servidor. Y para situar estas medidas en contexto, repasa cómo proteger tu página de los ataques más comunes contra una web.
06 Errores frecuentes y límites de nosniff
- ✓Activarla sin revisar los tipos MIME y romper scripts o estilos servidos como text/plain u octet-stream.
- ✓Creer que sustituye a validar los archivos subidos: sigue siendo necesario comprobar extensión, tipo y contenido.
- ✓Enviarla solo en las páginas HTML y no en los recursos estáticos o en las respuestas de la API.
- ✓Usar valores inventados: el único valor válido es nosniff.
- ✓Pensar que mejora el SEO: es una medida de seguridad, no un factor de posicionamiento.
Configurar bien las cabeceras, los permisos y el tratamiento de archivos es parte del trabajo de base de cualquier agencia de desarrollo web. Si tu web es un WordPress o una web corporativa, una empresa de diseño web que cuide también el servidor te evitará descubrir estos fallos después de un incidente.
Preguntas frecuentes sobre X-Content-Type-Options
Es una cabecera HTTP de seguridad que, con el valor nosniff, impide que el navegador adivine el tipo de un archivo y le obliga a usar el tipo MIME que declara el servidor.
Significa «no olfatear»: el navegador no debe analizar el contenido de un archivo para deducir su tipo. Es el único valor válido de la cabecera.
Sirve para evitar ataques XSS en los que un archivo subido como imagen o texto se interpreta como HTML o JavaScript, y para bloquear scripts y estilos servidos con un tipo incorrecto.
Con mod_headers activo, añade Header always set X-Content-Type-Options "nosniff" en el .htaccess o en la configuración del virtual host.
Añade add_header X-Content-Type-Options "nosniff" always; en el bloque server y recarga Nginx.
Sí, si algún script o CSS se sirve con un tipo MIME incorrecto: el navegador lo bloqueará. Revisa los tipos antes de activarla y prueba la web con la consola abierta.
Ejecuta curl -I con la URL de tu web y busca la línea x-content-type-options: nosniff, o mira las cabeceras de respuesta en la pestaña Red del navegador. Herramientas online como Mozilla Observatory revisan además el resto de cabeceras de seguridad.
No directamente. Es una medida de seguridad; su único efecto en SEO sería indirecto, al proteger la web de ataques que sí la perjudicarían.
Sí. Lo recomendable es aplicarla a todo el sitio, incluidos recursos estáticos, descargas y respuestas de API, siempre que cada archivo se sirva con su Content-Type correcto.
Fuentes consultadas
Sobre el autor
Development Manager en appyweb
Dirige el equipo de desarrollo de appyweb: aplicaciones web y móviles, SaaS, integraciones y arquitectura de software.
Ver perfil y artículos → Ver perfil en LinkedIn ↗