Cómo funciona esta comprobación
Este check solo actúa si tu web ya envía la cabecera Strict-Transport-Security; si falta del todo, lo marca el escáner de cabeceras. Scanaris lee el valor y comprueba dos cosas: que max-age sea de al menos un año (31536000 segundos) y que incluya includeSubDomains. Si falla cualquiera de las dos, abre un hallazgo de severidad baja con el detalle. Es baja porque un HSTS corto o parcial sigue protegiendo algo; pero deja huecos que un atacante puede aprovechar.
Qué hace HSTS y por qué los dos atributos
Cuando el navegador recibe esta cabecera por HTTPS, apunta tu dominio en una lista interna y, durante el tiempo que diga max-age, convierte cualquier intento de ir por http:// en https:// antes de enviar nada. Eso elimina la primera petición sin cifrar que una redirección no puede evitar. Un max-age de unas horas o días deja al usuario desprotegido cada vez que expira; de ahí el mínimo de un año. Sin includeSubDomains, un atacante puede atacar cualquiercosa.tudominio.com por HTTP y, por cómo funcionan las cookies de dominio, robar o fijar cookies que valen para la web principal.
Cómo arreglarlo
El valor recomendado:
Strict-Transport-Security: max-age=31536000; includeSubDomains
- Vercel: lo pone por defecto en los dominios propios; si usas
vercel.jsononext.configpara otras cabeceras, añádelo ahí con ese valor. - Netlify: en el archivo
_headers, bajo/*. - Nuxt: en
routeRulesdenuxt.config, regla'/**'. - nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;dentro del bloqueserverde 443. - Express:
helmet.hsts({ maxAge: 31536000, includeSubDomains: true }).
Antes de añadir includeSubDomains, confirma que todos tus subdominios sirven HTTPS: el panel de administración, la API, el blog en otro proveedor, el subdominio de correo si tiene web. Cualquiera que solo responda por HTTP dejará de funcionar en los navegadores que ya hayan visto la cabecera, y no hay forma de deshacerlo hasta que expire el max-age. Si no estás seguro, empieza con max-age=86400 y sin subdominios, revisa, y sube el valor cuando todo funcione.
Preload
Con preload y un max-age de al menos un año puedes pedir que tu dominio entre en la lista que traen de fábrica Chrome, Firefox y Safari: así ni siquiera la primera visita va por HTTP. Es la diferencia habitual entre una A y una A+ en las herramientas de análisis. Pero es un compromiso casi irreversible (salir de la lista tarda meses), así que hazlo solo cuando todo el dominio lleve tiempo en HTTPS sin incidencias.
Comprueba que está arreglado
curl -sI https://tudominio.com | grep -i strict-transport
Debe mostrar un max-age de 31536000 o más e includeSubDomains. Compruébalo en la URL pública: si tienes una CDN delante, es la que tiene que enviarla.
Preguntas frecuentes
¿HSTS sustituye a la redirección de HTTP a HTTPS?
No. La cabecera solo llega por HTTPS, así que la primera visita sigue necesitando la redirección. Son complementarias: la redirección para la primera vez, HSTS para todas las demás.
Tengo un subdominio interno que solo va por HTTP.
Entonces no pongas includeSubDomains hasta migrarlo, y acepta el hallazgo de severidad baja mientras tanto. Un subdominio sin cifrar es un riesgo real para las cookies del dominio, así que la migración merece la pena.
¿Qué pasa si lo configuro mal?
Los navegadores que hayan recibido la cabecera recordarán la política hasta que expire. Puedes enviar max-age=0 para pedirles que la olviden, pero solo lo verán los que vuelvan a visitarte por HTTPS. Por eso conviene empezar con valores cortos.