Saltearse al contenido

Cabeceras de seguridad

Las cabeceras HTTP de seguridad son defensas declarativas: el servidor le dice al navegador cómo comportarse para mitigar XSS, clickjacking, downgrade a HTTP, MIME sniffing, fuga de información y aislamiento de origen. Su ausencia no es un fallo por sí misma, pero habilita o agrava otras vulnerabilidades, por lo que son parte obligatoria de cualquier auditoría.

Sin las cabeceras adecuadas, un XSS reflejado se explota sin fricción, una página se puede enmarcar (clickjacking), el tráfico se degrada a HTTP (MITM/SSL stripping), los tokens se filtran por Referer, y el contenido subido se interpreta como ejecutable.

Catálogo (qué ataca cada una y valor recomendado)

Sección titulada «Catálogo (qué ataca cada una y valor recomendado)»

Controla de dónde se cargan recursos y qué scripts se ejecutan: defensa en profundidad contra XSS y exfiltración. Preferir nonce/hash + strict-dynamic (ver ficha XSS).

Content-Security-Policy: default-src 'self'; script-src 'nonce-RAND' 'strict-dynamic'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'

Fuerza HTTPS en el navegador, evita downgrade y SSL stripping. Con preload, el navegador ni siquiera intenta HTTP la primera vez.

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

CSP frame-ancestors (moderno) y X-Frame-Options (compatibilidad).

Content-Security-Policy: frame-ancestors 'none'
X-Frame-Options: DENY

Evita el MIME sniffing (que el navegador adivine el tipo y ejecute como script algo subido como imagen).

X-Content-Type-Options: nosniff

Limita la fuga de URLs (y tokens en la URL) por la cabecera Referer.

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

Restringe APIs potentes del navegador (cámara, micro, geolocalización, USB…).

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

Protegen frente a ataques cross-origin y side-channel (Spectre) y habilitan APIs de alta precisión. Cross-Origin-Opener-Policy, Cross-Origin-Embedder-Policy, Cross-Origin-Resource-Policy.

Set-Cookie: sid=...; HttpOnly; Secure; SameSite=Lax
# Prefijos que el navegador fuerza:
__Host-sid=...; Secure; Path=/ # solo ese host, sin Domain
__Secure-sid=...; Secure

Cache-Control: no-store en páginas con datos sensibles; Clear-Site-Data en logout.

Evalúa qué falta y aprovéchalo: sin CSP → XSS trivial; sin frame-ancestors → clickjacking; sin HSTS → downgrade/MITM; Referer laxo → fuga de tokens; sin nosniff → XSS por contenido subido. Herramientas: securityheaders.com, Mozilla Observatory, nuclei, y Burp.

Aplicar todas las anteriores; CSP primero en Report-Only para medir antes de forzar; __Host- para cookies de sesión; no-store en datos sensibles.

Escaneo periódico de cabeceras en todos los hosts (no solo la home); alertar si faltan en producción o si una CSP incluye unsafe-inline/unsafe-eval.

  • No suelen ser un CVE: son configuración. Su ausencia ha convertido XSS/clickjacking teóricos en explotables en innumerables auditorías y programas de bug bounty, y es motivo habitual de observaciones en informes de cumplimiento (PCI, ENS).
  • CSP presente y robusta (sin unsafe-inline), evaluada con CSP Evaluator.
  • HSTS (idealmente con preload), X-Content-Type-Options: nosniff.
  • frame-ancestors/X-Frame-Options.
  • Referrer-Policy y Permissions-Policy.
  • Flags y prefijos de cookie (HttpOnly/Secure/SameSite/__Host-).
  • Cache-Control: no-store en páginas con datos sensibles.