Sécurité

Headers HTTP de seguridad: Guía completa

Los 7 headers de seguridad HTTP imprescindibles para tu sitio web. Configuración para Apache, Nginx y Next.js con ejemplos.

5 mars 20254 min de lectureWarDek Team

Los headers de seguridad HTTP son la primera línea de defensa de tu sitio web. Actúan como instrucciones que tu servidor envía al navegador para indicarle cómo comportarse: qué scripts ejecutar, qué recursos cargar, cómo manejar las conexiones. Sin ellos, tu sitio queda expuesto a ataques XSS, clickjacking, MIME sniffing y muchos otros.

La buena noticia: configurarlos es cuestión de minutos y el impacto en seguridad es enorme.

Los 7 headers esenciales

1. Strict-Transport-Security (HSTS)

Obliga al navegador a usar siempre HTTPS, incluso si el usuario escribe http://. Previene ataques de downgrade SSL y man-in-the-middle.

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

Importante: solo activa includeSubDomains si TODOS tus subdominios tienen HTTPS. Un subdominio sin SSL quedará inaccesible.

2. Content-Security-Policy (CSP)

Controla qué recursos puede cargar tu página. Es la defensa más potente contra XSS.

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' https://fonts.gstatic.com; connect-src 'self' https://api.example.com; frame-ancestors 'none'

Empieza con una política restrictiva y ve añadiendo fuentes según las necesites. Usa Content-Security-Policy-Report-Only primero para detectar problemas sin bloquear.

Para una guía detallada de CSP, consulta: Content Security Policy — Guía completa.

3. X-Content-Type-Options

Previene el MIME sniffing: el navegador no intentará "adivinar" el tipo de contenido, respetando el Content-Type declarado.

X-Content-Type-Options: nosniff

Sin este header, un archivo .txt malicioso podría ejecutarse como JavaScript si el navegador interpreta su contenido como script.

4. X-Frame-Options

Previene el clickjacking: no permite que tu sitio se muestre dentro de un iframe en otro dominio.

X-Frame-Options: SAMEORIGIN

Opciones:

Nota: este header está siendo reemplazado por la directiva frame-ancestors de CSP, pero conviene mantenerlo para compatibilidad con navegadores antiguos.

5. Referrer-Policy

Controla qué información del referrer se envía cuando el usuario navega desde tu sitio a otro.

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

Opciones recomendadas:

6. Permissions-Policy

Controla qué APIs del navegador puede usar tu sitio (cámara, micrófono, geolocalización, etc.).

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

Desactiva por defecto todo lo que no necesites. Esto previene que scripts de terceros abusen de estas APIs.

7. X-XSS-Protection

Activa el filtro XSS del navegador. Aunque los navegadores modernos lo han desactivado en favor de CSP, no hace daño mantenerlo para navegadores antiguos.

X-XSS-Protection: 1; mode=block

Configuración por plataforma

Apache (.htaccess)

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
    Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'"
    Header always set X-XSS-Protection "1; mode=block"
</IfModule>

Nginx

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'" always;
add_header X-XSS-Protection "1; mode=block" always;

Next.js (next.config.js)

const securityHeaders = [
  { key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains' },
  { key: 'X-Content-Type-Options', value: 'nosniff' },
  { key: 'X-Frame-Options', value: 'SAMEORIGIN' },
  { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
  { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
]

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

Verificación

Después de configurar los headers, verifica que están activos:

  1. Herramientas de navegador: DevTools → Network → selecciona cualquier petición → Response Headers
  2. WarDek: escanea tu dominio y obtén una puntuación de headers de seguridad
  3. SecurityHeaders.com: herramienta gratuita de evaluación rápida
  4. Mozilla Observatory: auditoría completa de configuración HTTP

Errores comunes

Configurar CSP demasiado permisivo. Content-Security-Policy: default-src * es como no tener CSP. Empieza restrictivo y abre según necesidad.

Olvidar always en Nginx. Sin la directiva always, Nginx solo envía headers en respuestas 2xx, dejando las páginas de error sin protección.

HSTS con includeSubDomains sin verificar subdominios. Si un subdominio no tiene HTTPS, quedará inaccesible hasta que caduque el max-age.

No testear CSP antes de activar. Usa Content-Security-Policy-Report-Only primero para detectar violaciones sin bloquear contenido.

Cumplimiento normativo en España

Los headers de seguridad HTTP son un componente clave para cumplir con varias regulaciones europeas y españolas. El Esquema Nacional de Seguridad (ENS) exige cifrado en tránsito (HSTS), y la directiva NIS2 incluye las cabeceras de seguridad como parte de las medidas técnicas mínimas del Artículo 21. El INCIBE recomienda expresamente configurar HSTS, CSP y X-Content-Type-Options como parte de las buenas prácticas de ciberhigiene para PYMES.

Además, el RGPD exige medidas técnicas adecuadas para proteger datos personales. Cabeceras como CSP y X-Frame-Options reducen significativamente el riesgo de ataques que podrían comprometer datos de usuarios, lo que contribuye directamente al cumplimiento del artículo 32 del RGPD sobre seguridad del tratamiento.


Escanea tu sitio web gratis con WarDek — OWASP, NIS2, RGPD, AI Act en un solo escaneo.

#headers#seguridad-web#hsts#csp#configuracion

Scannez votre site gratuitement

WarDek détecte les vulnérabilités mentionnées dans cet article en quelques secondes.

Retour à Sécurité