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.
wp-config.phpEdita 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'");
}
Lenguaje del código: PHP (php)
👉 Esto permitirá que el escritorio admin se cargue correctamente durante actualizaciones, manteniendo a la vez una política estricta en el resto del sitio.
Plugins como HTTP Headers o Redirection te permiten configurar cabeceras HTTP de forma selectiva:
X-Frame-Options: SAMEORIGINContent-Security-Policy: frame-ancestors 'self' https://tudominio.comAsegúrate de que estos ajustes se apliquen solo a rutas del admin (/wp-admin/), si el plugin lo permite.
.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>
Lenguaje del código: PHP (php)
Puedes comprobar si los encabezados están bien configurados con:
curl -I https://tudominio.com/wp-admin/update.php
Lenguaje del código: JavaScript (javascript)
Deberías ver algo como:
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
Lenguaje del código: HTTP (http)
También puedes utilizar herramientas como:
Plugins como WP Rocket, Wordfence, Sucuri, o incluso configuraciones del servidor CDN (como Cloudflare), pueden sobrescribir estas cabeceras. Asegúrate de:
.htaccess personalizados o reglas Nginx adicionales.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.
