
Las cabeceras de seguridad son instrucciones que tu servidor envía junto con cada página. El visitante no las ve, pero su navegador las obedece: «usa siempre HTTPS», «no dejes que otro sitio me muestre dentro de un marco», «no ejecutes scripts de lugares que no conozco».
Son de las mejoras de seguridad con mejor relación costo-beneficio: unas pocas líneas, sin plugins, que protegen a quien visita tu sitio.
Las básicas (sin riesgo)
Estas cuatro se pueden poner en casi cualquier WordPress sin romper nada. En el .htaccess, fuera del bloque # BEGIN WordPress:
<IfModule mod_headers.c>
# No permitir que otros sitios te muestren dentro de un iframe
Header always set X-Frame-Options "SAMEORIGIN"
# El navegador no debe "adivinar" el tipo de archivo
Header always set X-Content-Type-Options "nosniff"
# Al salir hacia otro sitio, enviar solo el dominio, no la URL completa
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Desactivar accesos que tu sitio no usa
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
</IfModule>
Si tu tienda usa un botón de pago que necesita la API de pagos del navegador (como Apple Pay o Google Pay en algunas pasarelas), quita payment=() de la última línea.
HSTS: forzar HTTPS (con cuidado)
La cabecera HSTS le dice al navegador: «durante el próximo año, entra a este dominio solo por HTTPS, aunque te escriban http://«. Protege contra ataques en redes Wi-Fi públicas.
Header always set Strict-Transport-Security "max-age=31536000"
Antes de activarla, asegúrate de que todo tu dominio funciona con HTTPS, incluidos los subdominios si agregas includeSubDomains. Si después tu certificado falla, los visitantes no podrán entrar ni aceptando el riesgo, hasta que el certificado se arregle. Empieza con un valor corto, como max-age=86400 (un día), y súbelo cuando confirmes que todo funciona.
Content Security Policy (CSP): la más poderosa
La CSP le dice al navegador de qué dominios puede cargar scripts, estilos, imágenes y fuentes. Si un atacante logra inyectar un script que se carga desde su servidor, el navegador se niega a ejecutarlo. Es la mejor defensa contra ataques XSS.
El problema es que WordPress, los temas y los plugins usan muchos scripts en línea y de servicios externos (Analytics, YouTube, fuentes, pasarelas de pago). Una CSP estricta mal configurada rompe el sitio. Por eso se implementa en dos pasos.
Paso 1: modo de prueba
La cabecera Content-Security-Policy-Report-Only no bloquea nada: solo informa en la consola del navegador lo que habría bloqueado.
Header always set Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' 'unsafe-inline' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; frame-src https://www.youtube.com; frame-ancestors 'self'; object-src 'none'; base-uri 'self'"
Navega por tu sitio con la consola abierta (F12 → Consola) y anota cada aviso de «violación». Cada uno te dice qué dominio falta agregar.
Paso 2: activarla
Cuando durante unos días navegues sin avisos (incluido el pago, los formularios y el escritorio), cambia Content-Security-Policy-Report-Only por Content-Security-Policy.
Esta CSP incluye 'unsafe-inline' porque WordPress necesita scripts en línea. No es la CSP más estricta posible, pero bloquea los scripts de dominios desconocidos y los objetos peligrosos, y es realista para un WordPress normal.
Si usas Cloudflare o Nginx
- En Cloudflare: Reglas → Transformar reglas → Modificar encabezado de respuesta, y agregas cada cabecera con su valor. Sirve aunque no puedas editar el servidor.
- En Nginx: la directiva es
add_header Nombre "valor" always;dentro del bloqueserver.
Comprueba el resultado
curl -sI https://tudominio.cl/ | grep -iE "x-frame|x-content|referrer|permissions|strict|content-security"
También puedes usar el servicio gratuito securityheaders.com, que te da una nota y explica lo que falta.
¿La CSP en modo prueba te muestra avisos que no sabes interpretar? Pégalos en el foro y armamos la política en comunidad.





