Las cabeceras de seguridad son cabeceras de respuesta HTTP que indican a los navegadores que activen funciones de seguridad integradas. A la mayoria de sitios WordPress les faltan varias de estas cabeceras por defecto, porque ni el nucleo de WordPress ni la mayoria de los hosters las configuran automaticamente. La buena noticia es que anadirlas lleva solo unos minutos y la mejora de seguridad es importante. Esta guia cubre todas las cabeceras de seguridad importantes, explica que hace cada una y te muestra como anadirlas todas a la vez.
Que cabeceras de seguridad deberia tener todo sitio WordPress?
Esta es la lista completa de cabeceras de seguridad recomendadas con sus valores y de que protegen:
- X-Frame-Options: SAMEORIGIN: evita que tu sitio se cargue dentro de un iframe en otro dominio. Frena los ataques de clickjacking en los que un sitio malicioso superpone botones invisibles sobre tu pagina.
- X-Content-Type-Options: nosniff: impide que los navegadores adivinen el tipo MIME de un archivo. Sin esto, un atacante podria subir un archivo que parezca una imagen pero contenga JavaScript, y el navegador podria ejecutarlo.
- Referrer-Policy: strict-origin-when-cross-origin: controla cuanta informacion de la URL se comparte cuando los usuarios hacen clic en enlaces a otros sitios. Este valor envia la URL completa para peticiones del mismo origen, pero solo el dominio para peticiones de origen cruzado, protegiendo parametros sensibles de la URL.
- Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(): deshabilita funciones del navegador que tu sitio no usa. Los parentesis vacios significan "nadie puede usar esta funcion", lo que evita que scripts maliciosos accedan a la camara, el microfono o la ubicacion.
- Strict-Transport-Security: max-age=31536000; includeSubDomains: obliga a los navegadores a usar siempre HTTPS. Consulta nuestra guia dedicada de HSTS para detalles sobre un despliegue seguro.
- X-XSS-Protection: 1; mode=block: una cabecera heredada para navegadores antiguos que activa el filtro XSS integrado. Los navegadores modernos la han descartado en favor de CSP, pero no hace dano incluirla por compatibilidad hacia atras.
- Content-Security-Policy: la cabecera de seguridad mas potente (y compleja). Consulta nuestra guia dedicada de CSP para un recorrido completo.
Como priorizar: que cabeceras anadir primero
Si vas a anadir cabeceras de seguridad por primera vez, este es el orden que da la mayor mejora con el menor riesgo:
- X-Content-Type-Options: cero riesgo de romper nada. Solo anadela.
- X-Frame-Options: segura, salvo que incrustes intencionadamente tu sitio en iframes en otros dominios (poco probable en la mayoria de sitios WordPress).
- Referrer-Policy: riesgo muy bajo. El valor recomendado
strict-origin-when-cross-originya es el comportamiento por defecto en los navegadores modernos. - Permissions-Policy: riesgo bajo, salvo que tu sitio use realmente las APIs de camara, microfono o geolocalizacion.
- X-XSS-Protection: cabecera heredada, sin riesgo alguno.
- Strict-Transport-Security: requiere HTTPS funcionando. Sigue un despliegue gradual (consulta nuestra guia de HSTS).
- Content-Security-Policy: el mayor riesgo de romper cosas en WordPress. Empieza siempre con el modo Report-Only (consulta nuestra guia de CSP).
Anadir todas las cabeceras mediante .htaccess en Apache
Es el metodo mas comun para sitios WordPress en hosting compartido. Abre el archivo .htaccess en la raiz de tu WordPress y anade el siguiente bloque. Colocalo antes de la seccion # BEGIN WordPress para mantenerlo organizado:
<IfModule mod_headers.c>
# Evitar clickjacking
Header always set X-Frame-Options "SAMEORIGIN"
# Evitar MIME-type sniffing
Header always set X-Content-Type-Options "nosniff"
# Controlar la informacion del referrer
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Restringir funciones del navegador
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
# Forzar HTTPS (anadir solo si SSL funciona del todo)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# Proteccion XSS para navegadores heredados
Header always set X-XSS-Protection "1; mode=block"
</IfModule>Algunas cosas a tener en cuenta:
- El envoltorio
IfModulegarantiza que Apache no lance un error 500 simod_headersno esta habilitado en tu servidor. - Usar
Header always set(en lugar de soloHeader set) garantiza que las cabeceras se envien en todas las respuestas, incluidas las paginas de error. - Si ya tienes un bloque
<IfModule mod_headers.c>en tu.htaccess, anade las lineasHeaderindividuales dentro de ese bloque existente en vez de crear uno duplicado.
Anadir todas las cabeceras mediante Nginx
Si tu sitio WordPress se ejecuta en Nginx (habitual con hosters WordPress gestionados como Kinsta, Cloudways, GridPane o SpinupWP), anade estas lineas dentro de tu bloque server:
# Cabeceras de seguridad
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-XSS-Protection "1; mode=block" always;Notas especificas de Nginx importantes:
- La palabra clave
alwaysenvia la cabecera en todos los codigos de respuesta (incluidos 4xx y 5xx). Sin ella, Nginx solo envia las cabeceras en respuestas 2xx. - Si tienes un bloque
locationseparado que gestiona PHP (p. ej.,location ~ .php$), puede que tengas que anadir tambien las cabeceras alli, segun tu configuracion de Nginx. Nginx no hereda las directivasadd_headerde los bloques padres si el bloque hijo tiene su propioadd_header. - Tras hacer cambios, prueba y recarga siempre:
sudo nginx -t && sudo systemctl reload nginx.
Anadir cabeceras mediante PHP en WordPress
Si no puedes acceder a los archivos de configuracion del servidor, puedes enviar las cabeceras de seguridad desde PHP. Anade esto al functions.php de tu tema o a un plugin personalizado especifico del sitio:
function iwp_add_security_headers() {
if ( is_admin() ) {
return;
}
header( 'X-Frame-Options: SAMEORIGIN' );
header( 'X-Content-Type-Options: nosniff' );
header( 'Referrer-Policy: strict-origin-when-cross-origin' );
header( 'Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()' );
header( 'X-XSS-Protection: 1; mode=block' );
}
add_action( 'send_headers', 'iwp_add_security_headers' );La comprobacion is_admin() omite el area de administracion de WordPress para evitar posibles conflictos con la funcionalidad del admin. Ten en cuenta que este enfoque PHP tiene una limitacion: solo se aplica a las paginas que procesa WordPress. Los archivos estaticos (imagenes, CSS, JS, fuentes) servidos directamente por tu servidor web no llevaran estas cabeceras. Para una cobertura completa, la configuracion a nivel de servidor siempre es la mejor opcion.
Plugins de cabeceras de seguridad para WordPress
Si prefieres un enfoque basado en plugins, estas opciones ofrecen una interfaz amigable para gestionar las cabeceras de seguridad:
- HTTP Headers: un plugin gratuito con una interfaz completa para configurar todas las cabeceras de seguridad. Soporta X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy y mas. Lo configuras todo desde el admin de WordPress sin tocar archivos.
- Really Simple SSL Pro: la version premium incluye un modulo de cabeceras de seguridad que permite activar o desactivar cabeceras individuales. Tambien ofrece recomendaciones y explica cada cabecera.
- Headers Security Advanced & HSTS WP: un plugin enfocado especificamente en cabeceras de seguridad. Cubre todas las cabeceras principales e incluye preajustes para configuraciones habituales.
- Security Headers de Jeremykendall: una opcion ligera que anade todas las cabeceras recomendadas con valores por defecto sensatos.
Aunque los plugins son comodos, tienen contrapartidas. Si el plugin se desactiva, se actualiza con un fallo o se elimina, tus cabeceras de seguridad desaparecen al instante. Para sitios en produccion, la configuracion a nivel de servidor es mas fiable porque no depende de que WordPress o algun plugin esten activos.
Probar tus cabeceras con herramientas online
Despues de anadir tus cabeceras, verificalas con estas herramientas gratuitas:
- securityheaders.com: introduce tu URL y obten una nota entre A+ y F junto con un desglose detallado de que cabeceras estan presentes y cuales faltan. Apunta como minimo a una nota A.
- observatory.mozilla.org: la herramienta de Mozilla realiza un analisis mas exhaustivo, incluyendo evaluacion de CSP y seguridad de cookies.
- DevTools del navegador: pulsa F12, ve a la pestana Red, haz clic en la peticion del documento principal y desplazate hasta Cabeceras de respuesta para ver exactamente lo que envia tu servidor.
Tambien puedes comprobar desde la linea de comandos:
curl -sI https://example.comEsto muestra todas las cabeceras de respuesta, incluidas tus cabeceras de seguridad recien anadidas.
Consideraciones sobre CDN y proxy inverso
Si tu sitio WordPress esta detras de un CDN como Cloudflare, Sucuri o Fastly, ten en cuenta que el CDN puede eliminar, sobrescribir o anadir sus propias cabeceras. Esto es lo que necesitas saber:
- Cloudflare: no elimina las cabeceras de seguridad por defecto, asi que las cabeceras configuradas en tu servidor de origen pasaran a traves. Cloudflare tambien ofrece sus propios ajustes de cabeceras de seguridad en el panel, en SSL/TLS > Edge Certificates (para HSTS) y en las reglas gestionadas.
- Sucuri: su firewall puede anadir automaticamente algunas cabeceras de seguridad. Revisa los ajustes de tu panel de Sucuri para ver cuales estan activas y evitar duplicados.
- Fastly / KeyCDN / BunnyCDN: la mayoria de CDNs te permiten anadir cabeceras de respuesta personalizadas en su panel de configuracion. Puede ser una buena alternativa si no puedes modificar la configuracion del servidor en tu origen.
Si ves cabeceras duplicadas en tu respuesta (p. ej., dos lineas X-Frame-Options), puede provocar comportamientos impredecibles en el navegador. Asegurate de que cada cabecera se configura en un solo sitio: o en tu servidor de origen o a nivel de CDN, pero no en ambos.
Errores comunes al anadir cabeceras de seguridad
- Bloques IfModule duplicados: si tu
.htaccessya tiene un bloque<IfModule mod_headers.c>(quizas de un plugin), anadir un segundo puede causar conflictos. Junta tus cabeceras dentro del bloque existente. - Configurar cabeceras solo via PHP: esto deja fuera todos los archivos estaticos. Usa configuracion a nivel de servidor para una cobertura completa.
- Sobrescribir cabeceras en bloques location (Nginx): si un bloque
locationhijo tiene cualquieradd_header, sustituye todas las cabeceras del bloque padre. Tienes que repetir todas las cabeceras en cada bloque location que defina las suyas propias. - No probar tras actualizar plugins: una actualizacion de plugin o un cambio de tema puede eliminar tus cabeceras basadas en PHP. Vuelve a probar siempre tras cambios importantes.
- Olvidarse de los subdominios: si tienes subdominios (staging, mail, etc.), asegurate de que tambien tienen cabeceras de seguridad configuradas. Los atacantes suelen apuntar al subdominio mas debil.
Verifica tus cabeceras de seguridad con InspectWP
Despues de anadir todas las cabeceras, ejecuta un nuevo escaneo de InspectWP en tu sitio WordPress. La seccion de seguridad de tu informe lista cada cabecera de seguridad y muestra su estado. Cada cabecera presente y correctamente configurada aparecera en verde. Las cabeceras que falten apareceran en rojo o amarillo, segun su importancia. Usa la funcion de informes automaticos de InspectWP para monitorizar tus cabeceras a lo largo del tiempo y detectar cualquier regresion causada por cambios en el servidor o actualizaciones de plugins.