Nota de las cabeceras de seguridad

Seis líneas cortas en la respuesta de un servidor le dicen al navegador cuánto cuidado tener con tu página. Esta comprobación las lee, las puntúa sobre 100 y escribe por ti las que faltan.

O prueba github.com, wikipedia.org

Las cabeceras son instrucciones, no contenido

Cada vez que un navegador pide una página, el servidor responde en dos partes. La segunda parte es la página en sí. La primera es una lista de cabeceras, líneas cortas de nombre y valor que el visitante nunca ve, como el tipo de archivo, cuánto tiempo guardarlo en caché y qué cookies conservar.

Un puñado de esas líneas son instrucciones de seguridad. No hacen que tu servidor sea más difícil de vulnerar. Activan protecciones que todos los navegadores modernos ya llevan integradas y que siguen apagadas hasta que un sitio las pide. Un sitio que no envía ninguna funciona igual de bien. Simplemente deja una armadura gratis en la caja.

Las seis cabeceras que puntúa esta comprobación

CabeceraPuntosQué previene
Strict-Transport-Security25Que un visitante sea degradado sin darse cuenta a http:// sin cifrar en una red Wi-Fi hostil. Después de la primera visita, el navegador rechaza HTTP simple para tu dominio durante el tiempo que indique max-age.
Content-Security-Policy25Scripts inyectados. Publicas la lista de lugares desde los que puede cargarse código, y todo lo demás se bloquea, aunque un atacante logre colar una etiqueta <script> en un comentario o en un campo de formulario.
X-Frame-Options15El clickjacking, en el que otro sitio carga el tuyo en un marco invisible y engaña a la gente para que pulse tus botones. El equivalente moderno es frame-ancestors dentro de la CSP, que esta comprobación también acepta.
X-Content-Type-Options15Que se adivine el tipo. Con nosniff, un archivo subido como imagen no puede ejecutarse como script porque el navegador “pensó que lo parecía”.
Referrer-Policy10Filtrar las direcciones completas de las páginas, con todo lo privado que haya en la URL, a cada sitio al que enlazas.
Permissions-Policy10Contenido incrustado de terceros que pide la cámara, el micrófono o la ubicación en tu nombre.

Los pesos siguen el daño que evita cada una. Las dos cabeceras de 25 puntos detienen los ataques que de verdad vacían cuentas. Las de 10 puntos tratan de privacidad y de buenos modales.

Cómo leer la nota

Una cabecera solo cuenta por completo cuando su valor cumple su función. Tres situaciones reciben crédito parcial:

  • HSTS de menos de seis meses. Un max-age de un día está bien mientras pruebas, pero protege a los visitantes que vuelven durante un solo día.
  • Una CSP que permite 'unsafe-inline' o 'unsafe-eval' sin nonces ni hashes. Esa es justamente la puerta que la política debía cerrar.
  • Una CSP en modo Report-Only. Observa e informa pero todavía no bloquea nada. Es el primer paso correcto, siempre que no te quedes ahí.

La comprobación también enumera cada cookie que establece la página y si lleva Secure, HttpOnly y SameSite. Esas marcas no entran en la puntuación, pero una cookie de sesión sin ellas deshace buena parte de lo que logran las cabeceras.

Una A aquí significa que las protecciones del lado del navegador están activadas para esta respuesta concreta. No dice nada sobre contraseñas, plugins ni parches del servidor. Además, distintas páginas del mismo sitio pueden enviar cabeceras distintas, así que prueba las páginas que importan: inicio de sesión, pago, cuenta.

Dónde añadirlas

Las cabeceras se establecen allí donde se producen las respuestas, y gana la capa más cercana al visitante:

Una CDN o proxy (Cloudflare, Fastly, el borde de un proveedor)
Normalmente una regla de “response header” o de “transform” en el panel. Una sola regla cubre todo el sitio, páginas en caché incluidas.
Apache
En .htaccess o en el host virtual: Header always set X-Content-Type-Options "nosniff". La palabra always hace que se aplique también a las páginas de error.
nginx
add_header X-Content-Type-Options "nosniff" always; en el bloque server. Cuidado con una cosa: un add_header dentro de un bloque location reemplaza a los de arriba, no se suma a ellos.
La aplicación
Los frameworks y los plugins de CMS pueden enviar cabeceras, pero solo en las páginas que generan. Los archivos estáticos que sirve directamente el servidor web no las tendrán.

Empieza por las cuatro que no pueden romper nada: nosniff, X-Frame-Options: SAMEORIGIN, una Referrer-Policy y una Permissions-Policy. Añade HSTS cuando todos los subdominios funcionen por HTTPS. Deja la Content-Security-Policy para el final y despliégala primero en modo solo informe, porque una CSP equivocada bloqueará tus propios scripts.

Preguntas frecuentes

¿Romperá mi sitio añadir cabeceras de seguridad?

Cuatro de las seis se pueden añadir sin mirar. Las dos que requieren cuidado son HSTS y Content-Security-Policy. HSTS fija a los visitantes en HTTPS durante el tiempo que indiques, así que todos los subdominios deben tener ya un certificado válido si usas includeSubDomains. Una CSP bloquea todo lo que no esté en tu lista. Pruébala con Content-Security-Policy-Report-Only durante una o dos semanas antes de aplicarla.

¿Ayudan las cabeceras de seguridad al SEO?

No directamente. Los buscadores no posicionan las páginas por sus cabeceras. HTTPS es una señal de posicionamiento leve, y HSTS hace que HTTPS se mantenga. Lo que de verdad ganas son menos páginas hackeadas, y un sitio hackeado pierde posiciones rápido.

¿Por qué X-XSS-Protection no está en la lista?

Los navegadores eliminaron el filtro que controlaba. Chrome lo quitó en 2019 y Firefox nunca lo tuvo. El consejo actual es omitirla o ponerla en 0, y confiar en cambio en una Content-Security-Policy.

¿Qué max-age debe usar HSTS?

Un año (max-age=31536000) es el objetivo habitual y el mínimo para las listas de precarga de los navegadores. Empieza con unos minutos, comprueba que nada se rompe y luego súbelo por etapas. Esta comprobación da la puntuación completa a partir de seis meses.

Mi sitio está detrás de Cloudflare. ¿De quién son estas cabeceras?

De las que recibe el visitante, y esas son las que importan. Si tu servidor de origen establece una cabecera y la CDN la elimina o la sustituye, la nota refleja la versión de la CDN.