Gratis · sin cuenta

Comprobador de cabeceras de seguridad HTTP

Comprueba online las cabeceras de seguridad HTTP de una web pública. Introduce un dominio para ver cómo se valoran ocho cabeceras de seguridad clave en la respuesta final y, cuando se muestra, el valor observado.

Una comprobación gratuita de la configuración pública del sitio. Tu sitio web no se modifica.

Sin registro Sin tráfico destructivo Comprobaciones de sitios web públicos
Referencia de cabeceras

Qué hace cada cabecera y cómo se valora

El comprobador lee estas cabeceras en una sola respuesta. La mayoría de las filas son comprobaciones de presencia: cuenta que la cabecera se envíe, y su valor se muestra cuando está disponible para que puedas juzgar si encaja con tu sitio.

CabeceraQué haceUna buena configuraciónCómo la valora este comprobador
Strict-Transport-SecurityHace que los navegadores que vuelven pasen a HTTPS por sí solos, antes de que salga cualquier petición en HTTP sin cifrar.Un max-age largo (180 días o más) cuando termines la fase de despliegue; la guía explica las etapas.Ausente en un objetivo HTTPS: medio. No se valora si introduces una dirección http://.
Content-Security-PolicyDa al navegador una lista de orígenes permitidos para el código y el contenido de la página.Una política construida a partir de los recursos que tus páginas usan de verdad, sin excepciones amplias para scripts.Ausente: medio. El valor se muestra, pero no se revisa.
X-Frame-Options · frame-ancestorsImpide que otros sitios muestren tu página dentro de un marco suyo.frame-ancestors en tu CSP, con X-Frame-Options como respaldo para navegadores antiguos.Ninguna de las dos: medio.
X-Content-Type-OptionsHace que el navegador confíe en el tipo de contenido declarado de cada respuesta.El valor único nosniff.Ausente o con cualquier otro valor: bajo.
Referrer-PolicyLimita qué parte de la dirección de tu página ven otros sitios cuando los visitantes siguen tus enlaces.Una política al menos tan estricta como el valor predeterminado actual de los navegadores.Ausente: bajo.
Access-Control-Allow-OriginDecide qué scripts de otros sitios pueden leer tus respuestas.No enviada en páginas normales, o con un único origen de confianza.Un comodín (*): medio.
Server · X-Powered-ByAnuncia el software que hay detrás de la respuesta.Eliminada o reducida a un valor genérico.Cualquier cabecera Server o X-Powered-By: bajo, aunque no lleve número de versión. Solo se muestran nombres de tecnologías reconocidas.
Set-CookieCrea cookies; sus atributos deciden qué scripts pueden leerlas y cuándo se envían.Cookies de sesión ocultas a los scripts y enviadas solo por HTTPS.Una cookie de esta respuesta sin HttpOnly, o sin Secure en HTTPS: medio. SameSite no se comprueba y los valores de las cookies nunca se muestran.

Permissions-Policy y Cross-Origin-Opener-Policy no se valoran en esta página. El snapshot de preparación solo las cuenta en su calificación de Refuerzo, que es aparte.

Cómo corregirlo

Cómo añadir estas cabeceras en tu servidor

Configura cada cabecera en una sola capa que responda a todas las peticiones: el servidor web, la CDN o la plataforma de hosting. Empieza con los valores de abajo y endurécelos por etapas mientras revisas tus páginas clave.

Valores iniciales seguros

  1. 01Strict-Transport-Security: max-age=300Envíala solo en respuestas HTTPS; los navegadores la ignoran por HTTP sin cifrar. Sube max-age por pasos, por ejemplo a una semana, un mes y luego un año (31536000), y revisa tu sitio en cada paso. Añade includeSubDomains solo cuando todos los subdominios sirvan HTTPS, y preload solo después de leer los requisitos de hstspreload.org, porque salir de la lista de precarga tarda meses.
  2. 02Content-Security-Policy-Report-Only: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'Report-Only no bloquea nada: el navegador informa de lo que la política bloquearía, en la consola o en un endpoint de informes si añades uno. Abre tus páginas clave, añade los orígenes que realmente usan y luego envía la misma política como Content-Security-Policy. Evita 'unsafe-inline' para scripts; los nonces o hashes son la opción más estricta.
  3. 03frame-ancestors 'self' · X-Frame-Options: SAMEORIGINframe-ancestors en una Content-Security-Policy aplicada decide qué sitios pueden enmarcar tus páginas. X-Frame-Options cubre los navegadores antiguos y es la que bloquea mientras tu CSP sigue en Report-Only. Usa 'none' y DENY si tus páginas nunca se enmarcan, mantén ambos valores alineados y envía frame-ancestors como cabecera, porque los navegadores la ignoran en una etiqueta meta.
  4. 04X-Content-Type-Options: nosniffEnvía el valor único nosniff en todas las respuestas. Así los navegadores rechazan scripts y hojas de estilo servidos con un Content-Type incorrecto, de modo que comprueba antes que tu servidor etiqueta bien los archivos JavaScript y CSS.
  5. 05Referrer-Policy: strict-origin-when-cross-originLos otros sitios reciben solo tu origen, nunca la dirección completa de la página, y nada cuando un enlace va de HTTPS a HTTP. Los navegadores actuales ya lo usan por defecto; enviarla mantiene el mismo comportamiento en todas partes. Elige same-origin o no-referrer si tus URL llevan datos privados.
  6. 06Permissions-Policy: camera=(), microphone=(), geolocation=()Una lista vacía () desactiva una función para tu página y para cada marco que incrusta. Incluye solo funciones que tu sitio nunca usa y después revisa las páginas con mapas, videollamadas o widgets de pago.

Ejemplos listos para copiar por plataforma

Todos los ejemplos configuran los mismos valores iniciales. Las plataformas de hosting pueden enviar ya Strict-Transport-Security, así que los ejemplos de Vercel, Netlify y Next.js no la incluyen; revisa la respuesta real y añádela solo si falta.

nginx

Pon las líneas en el bloque server que sirve HTTPS. El parámetro always las añade también a las respuestas de error. Un bloque location con sus propias líneas add_header descarta todas las add_header heredadas del bloque server, así que repite el conjunto allí o guárdalo en un único archivo include.

# In the server block that serves HTTPS (listen 443 ssl)
add_header Strict-Transport-Security "max-age=300" always;
add_header Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

Apache

Activa mod_headers y añade las líneas al virtual host del puerto 443, o a .htaccess donde esté activado AllowOverride FileInfo. Header always set cubre también las respuestas de error y las redirecciones.

# <VirtualHost *:443> or .htaccess; needs mod_headers (Debian/Ubuntu: a2enmod headers)
Header always set Strict-Transport-Security "max-age=300"
Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"

Cloudflare

En el panel, crea una Response Header Transform Rule para tu nombre de host y añade cada cabecera con la operación Set static, que reemplaza una cabecera del mismo nombre que venga de tu origen. HSTS tiene su propio ajuste en SSL/TLS, Edge Certificates; usa ese ajuste o la regla, no ambos. Los nombres de los menús pueden variar según la versión del panel.

Rule type   Response Header Transform Rule
When        Hostname equals example.com
Then        Set static, one row per header:
  X-Content-Type-Options               nosniff
  Referrer-Policy                      strict-origin-when-cross-origin
  X-Frame-Options                      SAMEORIGIN
  Permissions-Policy                   camera=(), microphone=(), geolocation=()
  Content-Security-Policy-Report-Only  default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'

HSTS        SSL/TLS > Edge Certificates > HTTP Strict Transport Security (HSTS)

Vercel

Añade una entrada headers a vercel.json en la raíz del proyecto. El patrón source /(.*) coincide con todas las rutas; acótalo si algunas rutas necesitan otra política.

{
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        { "key": "Content-Security-Policy-Report-Only", "value": "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" },
        { "key": "X-Frame-Options", "value": "SAMEORIGIN" },
        { "key": "X-Content-Type-Options", "value": "nosniff" },
        { "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
        { "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=()" }
      ]
    }
  ]
}

Netlify

Crea un archivo llamado _headers en el directorio de publicación, la carpeta que Netlify despliega. Cada línea de ruta, como /*, va seguida de líneas sangradas Nombre: valor. Las mismas reglas también pueden ir en netlify.toml bajo [[headers]].

/*
  Content-Security-Policy-Report-Only: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
  X-Frame-Options: SAMEORIGIN
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin
  Permissions-Policy: camera=(), microphone=(), geolocation=()

Next.js

Devuelve las cabeceras desde la función async headers() de next.config.js; el source '/:path*' cubre todas las rutas. headers() no se ejecuta en una exportación estática (output: 'export'), así que en ese caso configura las cabeceras en el hosting que sirve los archivos exportados.

// next.config.js
const securityHeaders = [
  { key: 'Content-Security-Policy-Report-Only', value: "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" },
  { key: 'X-Frame-Options', value: 'SAMEORIGIN' },
  { key: 'X-Content-Type-Options', value: 'nosniff' },
  { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
  { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
];

module.exports = {
  async headers() {
    return [{ source: '/:path*', headers: securityHeaders }];
  },
};

Después de desplegar, vuelve a ejecutar el comprobador: lee la respuesta final, así que muestra lo que tu CDN o plataforma envía de verdad. Luego abre una página de error y un archivo estático en las herramientas de desarrollo del navegador, porque a menudo las cabeceras solo se configuran para algunas respuestas.

Cómo leer el resultado

Qué significa cada estado.

  1. 01AprobadoSe encontró la cabecera y supera la comprobación de presencia.
  2. 02Bajo · Medio · AltoFalta algo o está configurado de una forma que esta comprobación señala. El nivel es el mismo que usa el snapshot completo.
  3. 03ObservadoSe registró un valor, pero la comprobación no dio ni un aprobado ni un hallazgo.
  4. 04Nada observadoLa comprobación se ejecutó, pero no había nada que registrar, por ejemplo ninguna cookie en la respuesta.
  5. 05No aplicaLa comprobación no aplica, por ejemplo HSTS cuando introduces una dirección http://.
  6. 06No medidoNo se recibió una respuesta utilizable, así que la comprobación no cuenta como aprobada.
Alcance

Lo que este comprobador no hace.

  1. 01Solo solicita la página de inicio del origen que introduces. Se descartan rutas y consultas, y no se solicita ninguna otra página.
  2. 02Sobre todo comprueba si una cabecera está presente, no si su valor encaja con tu sitio.
  3. 03Prueba la redirección de HTTP a HTTPS solo cuando introduces la dirección http://; esa ejecución omite TLS y no informa de la falta de HSTS.
  4. 04No es un escaneo de vulnerabilidades ni una prueba de penetración, y no envía tráfico de ataque.
  5. 05El resultado es una vista puntual de una respuesta; una regla de CDN u otra página puede enviar cabeceras distintas.
Preguntas frecuentes

Preguntas sobre la comprobación de cabeceras.

¿Por qué se señala Server: nginx sin versión?

Cualquier cabecera Server o X-Powered-By se valora como bajo, porque el nombre por sí solo dice a los visitantes qué software ejecuta el sitio. Elimina la cabecera o redúcela a un valor genérico si tu plataforma lo permite.

¿Por qué el resultado no coincide con la configuración de mi servidor?

El comprobador lee la respuesta que recibe tras un máximo de cinco redirecciones. Cuentan las cabeceras que añade o quita una CDN, un proxy o la plataforma de hosting, y las reglas de CDN, proxy o protección contra bots pueden responder a los navegadores de forma distinta que al comprobador.

¿Puedo comprobar un sitio que no es mío?

Sí. La comprobación de cabeceras lee una respuesta normal que el sitio ya envía a cada visitante; la ejecución completa hace algunas peticiones normales más para las otras comprobaciones. Los módulos protegidos y las auditorías completas requieren un objetivo verificado o autorización explícita.

¿Es un escaneo de vulnerabilidades?

No. Es una comprobación pasiva de las cabeceras de respuesta, no un escaneo de vulnerabilidades ni una prueba de penetración, y no demuestra que un sitio sea seguro.

¿Por qué faltan mis cabeceras en algunas respuestas?

A menudo las cabeceras se configuran solo para una ruta, un tipo de archivo o un código de estado. En nginx, add_header sin always omite las respuestas de error, y un bloque location con sus propias líneas add_header descarta las del bloque server. Los archivos estáticos, las rutas de API y las páginas que sirve otro servicio también pueden saltarse la regla que las añade.

¿Puedo configurar la misma cabecera en la aplicación y en la CDN?

Configura cada cabecera en una sola capa. Si dos capas la añaden, el navegador puede recibir dos valores: con Content-Security-Policy se aplican todas las políticas enviadas, así que el resultado es más estricto que cualquiera de ellas, y con Strict-Transport-Security solo se usa la primera cabecera.

¿Debo enviar mi dominio a la lista de precarga HSTS?

Solo si todos los subdominios, actuales y futuros, pueden servir HTTPS. La lista exige un max-age de al menos un año con includeSubDomains y preload; después los navegadores usan HTTPS para el dominio incluso antes de la primera visita, y la retirada de la lista puede tardar meses en llegar a los usuarios. Un max-age largo sin preload ya cubre a los visitantes que vuelven.