En la mayoría de organizaciones, las cabeceras de seguridad se configuran “a ojo”: un plugin aquí, un snippet allá y, con el tiempo, inconsistencias entre la web corporativa, WordPress, SPAs y APIs. El resultado es predecible: exposición evitable a XSS, clickjacking, fugas de información o degradaciones a HTTP por configuraciones incompletas.
Esta guía propone un baseline estandarizado: un set coherente de cabeceras, verificable (con criterios claros) y aplicable por rutas para que puedas desplegarlo con control, medir impacto y endurecer progresivamente sin romper funcionalidades.
📌 Guía completa: Seguridad WordPress (checklist + prioridades).
✅ Acción rápida: Iniciar auditoría gratis y recibir evidencias en minutos.
1) Qué son y qué alcance tienen
Las cabeceras HTTP de seguridad son directivas que el servidor entrega al navegador para forzar políticas de protección. Su valor reside en que actúan en el cliente (navegador), limitando superficies de ataque habituales.
Lo que sí mitigamos:
- Cargas de recursos no autorizadas (según política).
- Enmarcado en iframes (clickjacking).
- Conexiones accidentales por HTTP cuando debería ser HTTPS.
- Fugas de referrer y ciertos vectores de interpretación de contenido.
Lo que no sustituyen:
- Saneamiento de entradas, control de acceso, hardening del servidor, ni corrección de vulnerabilidades en backend.
- Una configuración TLS correcta y mantenida.
- Un proceso de gestión de dependencias y parches.
2) Principios de implementación (estándar corporativo)
- Prioridad por impacto y reversibilidad
- Primero cabeceras “seguras y estables” (nosniff, referrer-policy, frame protection).
- Después políticas “potentes pero sensibles” (CSP, COOP/COEP).
- Aplicación consistente por rutas
- No siempre conviene “mismo set” para todo.
- Ejemplo: el panel de administración o una SPA pueden requerir CSP distinta a un blog.
- Despliegue controlado
- CSP: comenzar en modo Report-Only (si se habilitan reportes) y pasar a enforced tras validar.
- COOP/COEP: habilitar por aplicación/páginas concretas, evaluando terceros.
- Evitar contradicciones
- Si usamos CSP
frame-ancestors, debemos mantener coherencia conX-Frame-Options.
- Si usamos CSP
3) Cabeceras base recomendadas (baseline “mínimo serio”)
3.1 Strict-Transport-Security (HSTS)
Propósito: forzar HTTPS en visitas futuras y reducir downgrade/MITM.
Recomendación estándar (si todo el sitio y subdominios están en HTTPS estable):
Strict-Transport-Security: max-age=31536000; includeSubDomains
Notas operativas:
includeSubDomainssolo si todas las subzonas tienen HTTPS correcto.preloades una decisión estratégica (difícil de revertir). Solo se recomienda cuando existe plena certeza.
3.2 X-Content-Type-Options
Propósito: evitar MIME sniffing (interpretaciones peligrosas del navegador).
X-Content-Type-Options: nosniff
3.3 Referrer-Policy
Propósito: reducir fuga de URL completas hacia terceros.
Recomendación equilibrada:
Referrer-Policy: strict-origin-when-cross-origin
3.4 Protección anti-clickjacking
Opción A (clásica):
X-Frame-Options: DENY
Opción B (preferente en entornos modernos): usar CSP frame-ancestors (ver CSP).
Si mantenemos ambas, debemos asegurar que no se contradigan.
4) Content-Security-Policy (CSP): estándar seguro y desplegable
CSP es la cabecera más potente y, a la vez, la que más rompe cosas si se aplica sin análisis. Recomendamos un enfoque por fases.
4.1 CSP inicial (conservadora y útil)
Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; upgrade-insecure-requests
Qué aporta este baseline:
- Bloquea plugins peligrosos (
object-src 'none'). - Impide cambio de base URL malicioso (
base-uri 'self'). - Evita embedding en iframes (
frame-ancestors 'none'). - Eleva cargas HTTP a HTTPS cuando sea posible (
upgrade-insecure-requests).
4.2 CSP con terceros (realista)
Si usamos analítica, tag managers, chats, YouTube, fuentes externas, etc., debemos incorporar dominios explícitos. Ejemplo orientativo (no universal):
Content-Security-Policy: default-src 'self'; script-src 'self' https://www.googletagmanager.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'
Advertencias:
style-src 'unsafe-inline'se utiliza con frecuencia por compatibilidad (frameworks/temas), pero no es ideal.- Para endurecer, se recomienda migrar a nonces/hashes en scripts inline y minimizar inline.
4.3 Despliegue recomendado de CSP
- Fase 1:
Content-Security-Policy-Report-Only(si se dispone de endpoint de reportes). - Fase 2: endurecer reglas y eliminar permisos excesivos.
- Fase 3: pasar a
Content-Security-Policy(enforced).
5) Cabeceras avanzadas (según aplicación y dependencia de terceros)
Estas cabeceras son especialmente relevantes en apps modernas que buscan aislamiento robusto.
5.1 COOP (Cross-Origin-Opener-Policy)
Cross-Origin-Opener-Policy: same-origin
5.2 COEP (Cross-Origin-Embedder-Policy)
Cross-Origin-Embedder-Policy: require-corp
5.3 CORP (Cross-Origin-Resource-Policy)
Cross-Origin-Resource-Policy: same-origin
Riesgo operativo: COOP/COEP/CORP pueden romper integraciones con recursos de terceros que no ofrezcan CORS/CORP adecuados. Recomendamos habilitarlas por rutas o por aplicaciones donde haya control total del ecosistema de recursos.
6) Cabeceras complementarias recomendables
6.1 Permissions-Policy
Propósito: limitar APIs del navegador (cámara, micrófono, geolocalización, etc.) cuando no son necesarias.
Permissions-Policy: camera=(), microphone=(), geolocation=()
6.2 Clear-Site-Data (para logout o incident response)
Propósito: limpieza de cookies/storage/cache bajo escenarios controlados.
Clear-Site-Data: "cache", "cookies", "storage"
6.3 Reducción de fingerprinting (hardening)
Recomendamos evitar exponer tecnología/versión en cabeceras (p. ej. Server, X-Powered-By) cuando el stack lo permita.
7) Set estandarizado recomendado (lista final)
Baseline corporativo (recomendado para la mayoría)
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; upgrade-insecure-requests
Endurecimiento avanzado (bajo control de terceros)
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Resource-Policy: same-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
8) Ejemplos de configuración (Nginx / Apache)
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; upgrade-insecure-requests" always;
Apache (mod_headers)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set X-Frame-Options "DENY"
Header always set Content-Security-Policy "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; upgrade-insecure-requests"
9) Validación y control de calidad
Verificación rápida
curl -I https://dominio.tld(comprobar presencia y valores).- DevTools → Network → Response Headers (confirmar por ruta).
Criterios de aceptación (QA)
- No existen recursos críticos bloqueados tras aplicar CSP.
- No hay contenido mixto (si lo hay,
upgrade-insecure-requestspuede enmascarar parcialmente; conviene corregir origen). - HSTS no rompe subdominios (si se usa
includeSubDomains). - No hay contradicción entre XFO y CSP
frame-ancestors.
10) Errores comunes que debemos evitar
- HSTS con
includeSubDomainssin inventario de subdominios (riesgo de indisponibilidad). - CSP excesivamente permisiva (pierde valor) o excesivamente estricta sin fase de transición (rompe funcionalidades).
- Aplicar COOP/COEP “a ciegas” en sitios con múltiples terceros (roturas inesperadas).
- No separar por rutas (admin/app/api suelen requerir políticas distintas).