El clickjacking es una vulnerabilidad de seguridad frecuente en sitios web que puede mitigarse fácilmente mediante cabeceras HTTP como X-Frame-Options
o Content-Security-Policy
. En nuestro artículo anterior sobre cómo proteger WordPress contra clickjacking, explicamos cómo implementar estas medidas.
Sin embargo, si aplicas estas cabeceras de forma global, puede que el escritorio de WordPress no te permita actualizar plugins, temas o el propio core desde el navegador, debido a que esas operaciones utilizan iframes internamente.
Este artículo detalla cómo permitir solo esas rutas específicas sin comprometer el resto de la seguridad de tu sitio WordPress.
1. Solución condicional en wp-config.php
Edita el archivo wp-config.php
y añade lo siguiente:
// Permitir iframe solo para rutas de actualización del admin
if (
strpos($_SERVER['REQUEST_URI'], '/wp-admin/update.php') !== false ||
strpos($_SERVER['REQUEST_URI'], '/wp-admin/admin-ajax.php') !== false
) {
header('X-Frame-Options: SAMEORIGIN');
header("Content-Security-Policy: frame-ancestors 'self'");
} else {
header('X-Frame-Options: DENY');
header("Content-Security-Policy: frame-ancestors 'none'");
}
👉 Esto permitirá que el escritorio admin se cargue correctamente durante actualizaciones, manteniendo a la vez una política estricta en el resto del sitio.
2. Usar un plugin de seguridad (alternativa sin código)
Plugins como HTTP Headers o Redirection te permiten configurar cabeceras HTTP de forma selectiva:
- Ve a Ajustes → HTTP Headers.
- Configura:
X-Frame-Options
:SAMEORIGIN
Content-Security-Policy
:frame-ancestors 'self' https://tudominio.com
Asegúrate de que estos ajustes se apliquen solo a rutas del admin (/wp-admin/
), si el plugin lo permite.
3. Configurar .htaccess
con excepciones (para servidores Apache)
Edita tu archivo .htaccess
:
# Bloqueo por defecto
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
Header always set Content-Security-Policy "frame-ancestors 'none'"
</IfModule>
# Excepción para wp-admin/update.php
<FilesMatch "update.php|admin-ajax.php">
Header set X-Frame-Options "SAMEORIGIN"
Header set Content-Security-Policy "frame-ancestors 'self'"
</FilesMatch>
4. Verificación con herramientas CLI o online
Puedes comprobar si los encabezados están bien configurados con:
curl -I https://tudominio.com/wp-admin/update.php
Deberías ver algo como:
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
También puedes utilizar herramientas como:
- SecurityHeaders.com
- Clickjacker.io – Visita Clickjacker para probar si tu web es vulnerable
5. Precaución: conflictos con otros plugins
Plugins como WP Rocket, Wordfence, Sucuri, o incluso configuraciones del servidor CDN (como Cloudflare), pueden sobrescribir estas cabeceras. Asegúrate de:
- Borrar caché del navegador y plugins.
- Validar cabeceras activas después de cada cambio.
- Revisar los
.htaccess
personalizados o reglas Nginx adicionales.
Conclusión
Si estás aplicando políticas de seguridad estrictas en WordPress para protegerte del clickjacking, es fundamental que no interfieran con funciones básicas del escritorio como las actualizaciones. Afortunadamente, puedes hacerlo con condicionales, ajustes en el servidor o plugins especializados, sin renunciar a la protección del sitio.