PHP / Basico / 3 min
Deshabilitar XML-RPC en WordPress
Snippet PHP para functions.php que bloquea XML-RPC, oculta fingerprints y endurece wp-login.
XML-RPC es una API legada de WordPress que muchos ataques de fuerza bruta siguen usando, especialmente a través de system.multicall.
Este snippet deshabilita XML-RPC, reduce fingerprinting de versión, bloquea el editor de archivos del dashboard, ajusta Heartbeat API y limita revisiones sin instalar plugins pesados.
Guía de Implementación Paso a Paso
- Haz backup de
functions.phpantes de editar. - Agrega el código en el
functions.phpdel child theme o, mejor, como snippet PHP en WPCode. - Activa el snippet y limpia caché.
- Verifica que XML-RPC esté bloqueado con
curl.
BASH
curl -X POST https://tusitio.com/xmlrpc.php \
-H "Content-Type: text/xml" \
-d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName></methodCall>'
PHP
<?php
/**
* KODFLUX - WordPress Security Hardening
* Bloquea XML-RPC y asegura wp-login.php.
* Agregar en functions.php del child theme o vía WPCode.
*/
// 1. Deshabilitar XML-RPC completamente.
add_filter( 'xmlrpc_enabled', '__return_false' );
// Eliminar enlaces de detección XML-RPC del head.
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
// Bloquear métodos XML-RPC disponibles.
add_filter( 'xmlrpc_methods', function( $methods ) {
return [];
} );
// 2. Eliminar versión de WordPress del código fuente.
remove_action( 'wp_head', 'wp_generator' );
add_filter( 'the_generator', '__return_empty_string' );
add_filter( 'style_loader_src', 'kodflux_remove_version_strings', 9999 );
add_filter( 'script_loader_src', 'kodflux_remove_version_strings', 9999 );
function kodflux_remove_version_strings( $src ) {
if ( strpos( $src, 'ver=' ) ) {
$src = remove_query_arg( 'ver', $src );
}
return $src;
}
// 3. Deshabilitar editor de archivos en el dashboard.
if ( ! defined( 'DISALLOW_FILE_EDIT' ) ) {
define( 'DISALLOW_FILE_EDIT', true );
}
// 4. Throttle Heartbeat API para reducir carga de servidor.
add_filter( 'heartbeat_settings', function( $settings ) {
$settings['interval'] = 60;
return $settings;
} );
add_action( 'init', function() {
global $pagenow;
if ( $pagenow !== 'post.php' && $pagenow !== 'post-new.php' ) {
wp_deregister_script( 'heartbeat' );
}
} );
// 5. Limitar revisiones de posts a 3.
add_filter( 'wp_revisions_to_keep', function( $num, $post ) {
return 3;
}, 10, 2 );
// 6. Ocultar errores de login para no revelar si el usuario existe.
add_filter( 'login_errors', function() {
return 'Las credenciales ingresadas no son correctas.';
} );
// 7. Opcional: restringir REST API a usuarios autenticados.
// Comenta este bloque si usas WordPress headless o integraciones públicas.
/*
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! is_user_logged_in() ) {
return new WP_Error(
'rest_not_logged_in',
'La API REST de WordPress requiere autenticación.',
[ 'status' => 401 ]
);
}
return $result;
} );
*/
Prompt para Codex
TEXT
Crea un snippet PHP para WordPress (compatible con WPCode y functions.php) que implemente las siguientes medidas de seguridad y rendimiento:
1. Deshabilitar XML-RPC con add_filter xmlrpc_enabled => false y vaciar xmlrpc_methods
2. Eliminar links rsd_link y wlwmanifest_link del <head>
3. Quitar la versión de WordPress del HTML con remove_action wp_generator y the_generator filter
4. Eliminar el parámetro ?ver= de URLs de scripts y estilos para ocultar fingerprint
5. Definir DISALLOW_FILE_EDIT como true para bloquear el editor de archivos del dashboard
6. Reducir el intervalo del Heartbeat API a 60 segundos y desactivarlo fuera del editor de posts
7. Limitar revisiones de posts a 3 con filtro wp_revisions_to_keep
8. Personalizar el mensaje de error de login para no revelar si el usuario existe
9. Incluir bloque comentado (opcional) para restringir REST API a usuarios autenticados
Añade comentarios explicativos en español antes de cada sección. Sin plugins externos, solo WordPress nativo.