Mejor manera de eliminar xmlrpc.php
¿Cuál es la mejor manera de eliminar el archivo xmlrpc.php de WordPress cuando no lo necesitas?

Desde WordPress 3.5 esta opción (XML-RPC
) está habilitada por defecto, y la capacidad de desactivarla desde el panel de control
de WordPress ha desaparecido.
Añade este fragmento de código para usar en functions.php
:
// Deshabilitar el uso de XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );
// Deshabilitar X-Pingback en la cabecera
add_filter( 'wp_headers', 'disable_x_pingback' );
function disable_x_pingback( $headers ) {
unset( $headers['X-Pingback'] );
return $headers;
}
Aunque hace lo que dice, puede ser intensivo cuando un sitio está bajo ataque al ser golpeado.
Puede ser mejor usar el siguiente fragmento de código en tu archivo .htaccess
.
# Bloquear solicitudes a xmlrpc.php en WordPress
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>
O usa esto para deshabilitar el acceso al archivo xmlrpc.php
desde el bloque de servidor NGINX.
# Bloquear solicitudes a xmlrpc.php en nginx
location /xmlrpc.php {
deny all;
}
Ten en cuenta que deshabilitarlo también puede afectar a los inicios de sesión desde móviles. Si no me equivoco, la aplicación móvil de WordPress lo necesita.
Consulta el Codex para más información sobre el uso deXML-RPC
.
- Por favor, haz siempre una copia de seguridad de los archivos antes de editarlos o añadirles contenido.
Editar/Actualizar
@Prosti, -tienes toda la razón- sobre las opciones que la API RESTful
ofrecerá para WordPress.
Olvidé mencionar esto. Debería haber sido integrado en el núcleo (versión 4.1 de WordPress), lo cual no fue posible en ese momento. Pero parece que será parte del núcleo en WordPress 4.5.
La alternativa por el momento es este plugin: WordPress REST API (Versión 2)
Puedes usarlo hasta que la API RESTful
también sea parte del núcleo de WordPress.
Fecha objetivo para el lanzamiento de WordPress 4.5: (12 de abril de 2016 (+3 semanas))
Para aquellos interesados en
RESTful
, en Stackoverflow hay una muy buena wiki de la comunidad.

Si no me equivoco, la aplicación móvil de WordPress sí necesita esto - probablemente esto no será necesario en el futuro una vez que hayamos hecho la transición a la API RESTful de WordPress (WordPress 4.5)

Para aquellos que todavía obtienen el encabezado X-Pingback
para publicaciones/páginas individuales. Necesitamos usar otro filtro para eliminarlo completamente: add_filter('pings_open', '__return_false', PHP_INT_MAX);
.

Agregar cosas como esas al functions.php
hará que pierdan todo efecto al cambiar de temas. function.php
es solo para propósitos de diseño, ¡usa un plugin!

@David, claro, pero la gente debería usar mejor la carpeta mu-plugins, en lugar de crear un plugin para esto. Cuando la gente necesita/usa una función como esta, lo hace por una razón y no quiere que nadie (ni siquiera un administrador) tenga la opción de desactivar un plugin.

Cuando tienes la capacidad de bloquearlo a través de la configuración de tu servidor web, las sugerencias de @Charles son buenas.
Si solo puedes deshabilitarlo usando PHP, el filtro xmlrpc_enabled
no es la forma correcta.
Como está documentado aquí:
https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/
solo deshabilita los métodos XML-RPC que requieren autenticación.
En su lugar, usa el filtro xmlrpc_methods
para deshabilitar todos los métodos:
<?php
// Deshabilitar todos los endpoints xml-rpc
add_filter('xmlrpc_methods', function () {
return [];
}, PHP_INT_MAX);
Puedes probar si está funcionando enviando una petición POST a xmlrpc.php con el siguiente contenido:
<methodCall>
<methodName>system.listMethods</methodName>
</methodCall>
Si el filtro está funcionando, solo deberían quedar 3 métodos:
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<array>
<data>
<value>
<string>system.multicall</string>
</value>
<value>
<string>system.listMethods</string>
</value>
<value>
<string>system.getCapabilities</string>
</value>
</data>
</array>
</value>
</param>
</params>
</methodResponse>
Puedes probarlo rápidamente con curl:
curl -X POST \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/xml' \
-d '<methodCall><methodName>system.listMethods</methodName></methodCall>' \
https://tu-sitio-wordpress.com/xmlrpc.php

Lo mejor es deshabilitar las funciones de xmlrpc.php
con un plugin en lugar de eliminar o desactivar el archivo en sí. El archivo se reemplazará en las actualizaciones del núcleo de WordPress, mientras que un plugin mantendrá la desactivación después de las actualizaciones del núcleo y si cambias de tema.
Consulta https://wordpress.org/plugins/search.php?q=disable+xml-rpc para ver diferentes plugins. Todos tienen pequeñas diferencias.
Estos plugins hacen lo mismo que agregar una función al archivo functions.php
del tema o agregar una regla order,allow deny
al .htaccess (como se describe en otras respuestas), con la diferencia de que un plugin o función desactiva las llamadas a xmlrpc.php
mediante PHP, y la regla en .htaccess funciona aprovechando mod_rewrite en el servidor web (es decir, Apache o Nginx). No hay una diferencia apreciable de rendimiento entre usar PHP y mod_rewrite en un servidor moderno.

Para la minoría extrema que está alojando WordPress en IIS, podrías utilizar el módulo de Reescribir URL de IIS para implementar restricciones similares a las de htaccess. El ejemplo siguiente asume que la IP real del cliente viene en la cabecera X-Forwarded-For, la IP conocida de la lista blanca es 55.55.555.555, y que deseas responder con un HTTP 404 a las IPs que no están en la lista blanca.
<rule name="wordpress-restrictions" enabled="true" stopProcessing="true">
<match url="(^xmlrpc.php)|(^wp-admin)|(^wp-login.php)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_X_FORWARDED_FOR}" pattern="(^55\.55\.555\.555$)" negate="true" />
</conditions>
<action type="CustomResponse" statusCode="404" subStatusCode="44" statusReason="Archivo o directorio no encontrado" statusDescription="El recurso que estás buscando podría haber sido eliminado, haber cambiado de nombre o no estar disponible temporalmente." />
</rule>

La mejor manera es usar el archivo .htaccess para bloquear todas las solicitudes agregando
# Bloquear solicitudes a xmlrpc.php de WordPress
<Files xmlrpc.php>
order deny,allow
deny from all
allow from 1.1.1.1
</Files>
al final del archivo pero si quieres la forma más fácil usando el plugin Disable XML-RPC-API hará el trabajo.

Recientemente instalé Wordfence que, a partir de la versión 6.3.12, tiene la capacidad de bloquear el acceso directo a cualquier ubicación. Al agregar /xmlrpc.php en la página de Opciones en la lista de IPs con acceso prohibido "Bloquear inmediatamente las IPs que accedan a estas URLs", ahora muestra un intento bloqueado aproximadamente cada 15 minutos.
Esto también tiene la ventaja de poder bloquear una URL para escapar de esos bots molestos que regresan con una dirección IP diferente una y otra vez.
No sé si permite el uso de xmlrpc.php por parte de aplicaciones para operaciones válidas.
Al principio tuve algunos problemas con errores 504 Timeout y 502 Bad Gateway en el servidor, pero parece que se ha estabilizado.
Estoy muy impresionado con los resultados hasta ahora y generó un valioso perfil de limpieza después de que el sitio había sido hackeado antes de instalar Wordfence, a pesar de tener siempre la última versión de WordPress y los plugins.

Agregar /xmlrpc.php
a una regla de seguridad que prohiba las IPs que accedan a ella parece que podría bloquear tráfico legítimo. Si un sitio con pingbacks habilitados enlaza a tu sitio, ese sitio enviará una solicitud a esa URL y será bloqueado inmediatamente... parece que podría causar problemas.

Uso de un Plugin de Seguridad (Recomendado):
Una de las formas más sencillas de bloquear el acceso a xmlrpc.php en WordPress es utilizando un plugin de seguridad como Wordfence
o Sucuri Security
. Estos plugins suelen incluir opciones para bloquear XML-RPC o archivos específicos como xmlrpc.php.
Uso de Reglas en el Servidor (Apache)
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Uso de Reglas en el Servidor (Nginx)
location ~* /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
}
Reinicia tu Nginx
sudo systemctl reload nginx
Desactivar XML-RPC mediante wp-config.php:
define('XMLRPC_REQUEST', false);
