Back to articles

Los encabezados de seguridad que la mayoría de los sitios aún omiten: Datos de 49 auditorías reales

SEOReport Team·
security-headersweb-securitycsphststechnical-seoseo-audit

Los encabezados de respuesta son líneas únicas de configuración que se incluyen con cualquier despliegue. En los sitios que auditamos, la mayoría no envía ninguno de ellos — Permissions-Policy está ausente en 69%, y el encabezado mejor adoptado de la lista sigue faltando en 41%.

Para este informe leímos 6 encabezados de seguridad en la respuesta final de la página de inicio de cada sitio auditado, después de las redirecciones. Un encabezado enviado solo en un salto previo a la redirección no cuenta, porque el navegador nunca lo aplica a la página. La pregunta es deliberadamente acotada: ¿llevaba la respuesta el encabezado, sí o no?

En 49 sitios auditados entre mayo 23 y August 31, 2026, la respuesta suele ser no. Permissions-Policy falta en 69% de ellos, Referrer-Policy en 65%, Content-Security-Policy en 61%, X-Frame-Options en 51%, X-Content-Type-Options en 43%, y Strict-Transport-Security — el mejor adoptado de los 6 — en 41%.

Metodología: instantánea de auditoría completada más reciente por dominio de nuestro conjunto de comprobaciones actual, aproximadamente mayo 23 – August 31, 2026, 49 dominios distintos, anonimizado. Cada porcentaje es la participación de sitios cuya respuesta de la página de inicio no llevaba ese encabezado. La muestra es auto-seleccionada — propietarios que realizaron una auditoría — y se inclina hacia sitios pequeños y medianos, lo que probablemente subestime la adopción de encabezados en toda la web, ya que las grandes plataformas los establecen en el borde. Trate las participaciones como direccionales para la cola larga.

Share of 49 Audited Sites Missing Each Security Header

Estas cifras miden presencia, no calidad

La precisión sobre la medición importa aquí, porque establece el techo de lo que estos números pueden afirmar.

Las cifras describen 1 respuesta por sitio: la página de inicio, después de las redirecciones. Presencia significa un valor no vacío, y nada más. Un encabezado Strict-Transport-Security cuyo max-age es de 1 segundo cuenta como presente, igual que una Content-Security-Policy tan permisiva que lo admite todo. La presencia no dice nada sobre si la política está bien construida.

Eso parece una barra débil hasta que consideres lo que mide. Un encabezado con cualquier valor en absoluto es evidencia de que un humano una vez abrió una configuración de servidor, una regla CDN, o un archivo middleware y escribió una directiva. La medición es una prueba de si la capa de configuración de un sitio alguna vez ha sido tocada con intención — por eso las tasas de fallo son la parte interesante, no las tasas de aprobación.

Dos detalles deciden si un encabezado que usted ya envía protege algo de verdad:

  • CSP en modo report-only no aplica nada. Content-Security-Policy-Report-Only registra las violaciones sin bloquearlas. Es la forma correcta de empezar, pero mientras no se envíe el encabezado Content-Security-Policy que sí aplica la política, esta no protege nada.
  • frame-ancestors y X-Frame-Options llegan a clientes distintos. Una directiva CSP frame-ancestors es el mejor control, y los clientes antiguos solo leen el encabezado heredado X-Frame-Options. Envíe ambos.

La adopción indica cuán antiguo es un encabezado, no cuán difícil es

El orden de las tasas de fallo está casi en orden cronológico inverso. HSTS, el más antiguo de los 6 y reducible a un interruptor en cada panel principal CDN, es el mejor adoptado. X-Content-Type-Options y X-Frame-Options, ambas convenciones de proveedores que preceden a sus sucesores formales, se sitúan en el medio. Referrer-Policy y Permissions-Policy, los dos más recientes, son los dos más ausentes — y Permissions-Policy, que ningún host común establece en tu nombre, es el último.

Ninguno de ellos es más difícil que los demás en términos de ingeniería. 5 de los 6 son una línea estática en un bloque de servidor, una regla CDN o un archivo de middleware de borde, sin cambios de aplicación y sin riesgo de comportamiento. Lo que los separa es cuánto tiempo han tenido que acumular valores predeterminados y cuántas publicaciones de blog, listas de verificación y plantillas de framework los han absorbido. Vimos la misma forma cuando clasificamos cada comprobación fallida en nuestro historial de auditoría: los encabezados de respuesta dominaron la parte superior de la lista, por encima de la canonización, el renderizado y el rendimiento. Esa clasificación cubrió una ventana diferente, una muestra diferente y un conjunto de comprobaciones anterior, por lo que los dos conjuntos de porcentajes no son una línea de tendencia — pero la posición de los encabezados en la parte superior de ambos es el hallazgo duradero.

La otra razón estructural es la invisibilidad. Un encabezado faltante no cambia nada en la pantalla. Ningún CMS te advierte, ningún build falla, ningún panel se vuelve rojo. La ausencia solo es observable para algo que inspecciona respuestas crudas — lo cual es exactamente lo que hace una auditoría, el estado de seguridad de un navegador y una creciente proporción de lectores automatizados. Es la misma asimetría que encontramos en render parity: lo que los humanos ven en un navegador y lo que las máquinas reciben sobre HTTP se han divergido silenciosamente.

Lo que cada encabezado protege

Strict-Transport-Security indica al navegador que rechace HTTP en texto plano para tu dominio durante un período declarado, lo que cierra la ventana de redirección que un atacante en la red puede secuestrar antes de que tu redirección http:// → https:// se active. También es el único encabezado de la lista que lleva un compromiso: los navegadores honran el max-age incluso si luego rompes el HTTPS. Comienza corto, confirma que cada subdominio y recurso se sirva limpiamente sobre TLS, luego amplía.

Strict-Transport-Security: max-age=31536000; includeSubDomains

Content-Security-Policy limita de dónde pueden provenir scripts, estilos, marcos y conexiones. Es el único encabezado aquí que contiene un incidente en lugar de prevenir una categoría de uno: cuando un gestor de etiquetas se ve comprometido o la entrada del usuario llega al DOM, CSP decide si el script inyectado puede ejecutarse o alcanzar un servidor que elija. También es el único que puede romper una página funcional, por eso pertenece al final de la secuencia a continuación.

Content-Security-Policy-Report-Only: default-src 'self'

X-Frame-Options declara si otros orígenes pueden colocar tus páginas en un marco. Sin él, tu interfaz puede ser incrustada bajo una superposición transparente en la página de un atacante y ser clickeada por usuarios que creen que están en tu sitio. La CSP moderna expresa esto mejor con frame-ancestors; envía ambos, ya que los clientes antiguos solo leen el encabezado heredado.

X-Frame-Options: DENY

X-Content-Type-Options evita que los navegadores adivinen el tipo de respuesta cuando el Content-Type declarado se ve incorrecto. El sniffing es cómo un archivo subido que sirves como texto puede ejecutarse como un script en su lugar. El encabezado tiene exactamente 1 valor válido.

X-Content-Type-Options: nosniff

Referrer-Policy regula cuánto del actual URL viaja a terceros en clics salientes y cargas de subrecursos. Tus URLs llevan parámetros de campaña, consultas de búsqueda internas, identificadores de cuenta y a veces tokens, y cada píxel de análisis y fuente CDN en la página es un destinatario. Los principales navegadores han convergido en un valor predeterminado razonable, pero un valor predeterminado es una decisión que el agente de usuario toma por ti y varía por cliente; enviar el encabezado hace que tu política sea explícita y permite que un sitio que maneja URLs sensibles elija algo más estricto, como same-origin.

Referrer-Policy: strict-origin-when-cross-origin

Permissions-Policy decide qué capacidades del navegador puede solicitar tu documento y sus marcos embebidos — cámara, micrófono, geolocalización y el resto de la lista de funciones potentes. Sin el encabezado, todo lo que no deshabilitaste está disponible para cada script en la página, incluidos los tags de terceros que no escribiste. Niega lo que no usas.

Permissions-Policy: camera=(), microphone=(), geolocation=()

Envía primero los 4 one-liners, luego pasa una tarde en CSP

El valor protector y el riesgo de despliegue no coinciden en exactamente 1 encabezado, y el orden de corrección resuelve la discrepancia a favor del envío.

NoSíLee tus propiosencabezados de respuestaDespliega 1: HSTS con unmax-age cortoDespliega 2: nosniff,Referrer-Policy,Permissions-Policy,X-Frame-OptionsExtiende el max-age deHSTS una vez que TLSesté confirmado en todaspartesCSP en modo solo-reporteInformes de violaciónlimpios?Ajustar fuentes, mantenermodo solo-reporteAplicar CSP, añadirframe-ancestors
Diagram source
graph TD
    A[Lee tus propios encabezados de respuesta] --> B[Despliega 1: HSTS con un max-age corto]
    B --> C[Despliega 2: nosniff, Referrer-Policy, Permissions-Policy, X-Frame-Options]
    C --> D[Extiende el max-age de HSTS una vez que TLS esté confirmado en todas partes]
    D --> E[CSP en modo solo-reporte]
    E --> F{Informes de violación limpios?}
    F -->|No| G[Ajustar fuentes, mantener modo solo-reporte]
    G --> F
    F -->|Sí| H[Aplicar CSP, añadir frame-ancestors]

Despliegue 1 — HSTS, breve. Alto valor protector y riesgo casi nulo cuando su sitio ya sirve HTTPS en todas partes. Establecer un max-age modesto primero para que un problema TLS en un subdominio olvidado sea recuperable.

Despliegue 2 — las 4 líneas estáticas juntas. nosniff, Referrer-Policy, Permissions-Policy y X-Frame-Options son valores estáticos sin dependencia de aplicación. Son 4 de los 6 encabezados y, con estas tasas de fallo, la mayoría de lo que un sitio promedio está perdiendo. No hay razón para separarlos por etapas.

Luego extiende HSTS, una vez que hayas confirmado que cada host bajo el dominio sirve limpiamente sobre TLS.

Último — CSP, en modo solo-reporte. Despliega Content-Security-Policy-Report-Only, recopila violaciones del tráfico real, y enumera las fuentes de script y conexión en las que realmente dependes. Solo entonces cambia el encabezado a forzante y añade frame-ancestors junto a tu línea X-Frame-Options. Mayor esfuerzo, último en la secuencia, porque es el único elemento de la lista que puede derribar una página funcional.

Lee tus propios encabezados en el comando 1

Toda la medición es reproducible desde un terminal. Siga las redirecciones, porque la respuesta final es la que aplica el navegador:

bash
curl -sSL -o /dev/null -D - https://example.com/ \
| grep -iE 'strict-transport-security|content-security-policy|x-frame-options|x-content-type-options|referrer-policy|permissions-policy'

Cada línea que no aparece es un encabezado que su página de inicio no envía. Todos los 6 que regresan significa que la barra de presencia está limpia y la siguiente pregunta — si las políticas en sí son buenas — vale la pena hacerla. Un diagnóstico de pago de SEOReport enumera cada encabezado ausente con el valor que lo resuelve.

Los encabezados en este conjunto de datos no faltan porque son difíciles o controvertidos. Faltan porque nada en la vida ordinaria de un sitio web jamás muestra su ausencia: sin error, sin cambio visual, sin compilación fallida. Los sitios que pasan son los que alguna vez alguien buscó — y ese único despliegue sigue disponible para la mayoría que no lo tiene.

Obtenga el diagnóstico completo de su sitio

Un informe basado en evidencia y un plan de acción priorizado, con un plan de créditos mensuales.