Parte 7 de la serie "Seguridad web en la UE: 10 pasos para una mejor calificación"
X-Content-Type-Options
El problema
Los navegadores a veces intentan "adivinar" el tipo de un archivo — independientemente de la cabecera Content-Type. ¿Una imagen que en realidad contiene JavaScript? El navegador lo ejecuta. Esto se llama MIME sniffing, y es una puerta de entrada para ataques de inyección.
La solución
X-Content-Type-Options: nosniff
Una cabecera, un valor. El navegador solo acepta archivos con el tipo MIME declarado.
Adopción: 27,7%. Casi tres cuartas partes de los sitios web de la UE son vulnerables a ataques de confusión MIME.
Cómo configurarlo
Nginx:
add_header X-Content-Type-Options "nosniff" always;
Apache:
Header always set X-Content-Type-Options "nosniff"
Solo hay un valor válido (nosniff), sin configuración, sin efectos secundarios. No hay razón para no configurarlo.
Referrer-Policy
El problema
Cuando un usuario hace clic en un enlace externo en tu sitio web, el navegador envía la URL completa de la página de origen como cabecera Referrer por defecto. Esto puede filtrar información sensible:
https://tu-dominio.com/dashboard?user=12345&token=abchttps://tu-dominio.com/admin/reports/auditoria-confidencialhttps://tu-dominio.com/search?q=sintomas+medicos
El operador del sitio de destino ve la URL completa — incluyendo parámetros de consulta, rutas y tokens de sesión.
La solución
Referrer-Policy: strict-origin-when-cross-origin
Con esta política, el navegador envía:
- Al navegar a otro dominio: solo el origen (https://tu-dominio.com), sin rutas
- Dentro de tu propio dominio: la URL completa (útil para analítica)
- En degradación HTTPS a HTTP: nada
Adopción: 13,1%.
Cómo configurarlo
Nginx:
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Apache:
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Políticas alternativas
| Política | Comportamiento | Recomendación |
|---|---|---|
no-referrer |
Nunca enviar referrer | Demasiado estricto (rompe analítica) |
origin |
Siempre enviar solo el origen | Bueno, pero pierde rutas internas |
strict-origin-when-cross-origin |
Origen entre dominios, completo internamente | Recomendado |
same-origin |
Completo internamente, nada externamente | Bueno para aplicaciones sensibles |
Ambas juntas: el snippet de Nginx
# Cabeceras de seguridad — listo para copiar y pegar
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Cuatro cabeceras, cuatro líneas. En tu configuración de Nginx o un archivo include. Combinadas con las Partes 1-3 de esta serie, cubren las seis cabeceras de seguridad más importantes.
Comprueba tus cabeceras
La próxima semana en la Parte 8: Registros CAA — ¿qué autoridad de certificación tiene permiso para emitir certificados para tu dominio?