¿La mejor manera de eliminar xmlrpc.php?

Respuestas:

26

Desde WordPress 3.5, esta opción ( XML-RPC) está habilitada de forma predeterminada, y la capacidad de desactivarlo desde WordPress dashboardha desaparecido.

Agregue este fragmento de código para usarlo en functions.php:

// Disable use XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );

// Disable X-Pingback to header
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 golpearlo.
Es mejor que use el siguiente fragmento de código en su .htaccessarchivo.

# Block WordPress xmlrpc.php requests
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>

O use esto para deshabilitar el acceso al xmlrpc.phparchivo desde el bloque del servidor NGINX.

# nginx block xmlrpc.php requests
location /xmlrpc.php {
    deny all;
}

Tenga en cuenta que la desactivación también puede tener un impacto en los inicios de sesión a través de dispositivos móviles. Si estoy en lo cierto, la aplicación móvil de WordPress necesita esto.
Ver Codex para más información sobre el uso de XML-RPC.

  • Haga siempre una copia de seguridad de los archivos antes de editar / agregar.


Editar / Actualizar

@Prosti, -Usted tiene toda la razón- acerca de las opciones que RESTful APIofrecerá para WordPress.

Olvidé mencionar esto. Ya debería haberse integrado en el núcleo ( WordPress versión 4.1 ) que no era posible en ese momento. Pero como parece, será fundamental en WordPress 4.5.

La alternativa por el momento es este complemento: WordPress REST API (Versión 2)
Puede usarlo hasta Restful APIque también sea el núcleo de WordPress.
Fecha objetivo para el lanzamiento de WordPress 4.5. (12 de abril de 2016 (+ 3w))

Para aquellos que estén interesados RESTful, en Stackoverflow es una wiki comunitaria muy agradable.

Charles
fuente
2
Si estoy en lo cierto, la aplicación móvil de WordPress necesita esto : probablemente esto no será necesario en el futuro una vez que tengamos la transición a la API RESTful de WordPress (WordPress 4.5)
prosti
2
Para aquellos que todavía obtienen X-Pingbackencabezado para publicación / página única. Tenemos que utilizar otro filtro para eliminar por completo: add_filter('pings_open', '__return_false', PHP_INT_MAX);.
MinhTri
1
Agregar cosas como esas functions.phpperderá todo efecto al cambiar de tema. function.phpes solo para fines de diseño, ¡use un complemento!
David
@David, claro, pero por favor, mejor usa la carpeta mu-plugins, en lugar de crear un complemento de este tipo. Cuando ppl necesita / usa una función como esta, la tiene por una razón y no quiere que nadie (ni siquiera un administrador) tenga la opción de desactivar un complemento.
Charles
Parece que =falta un signo igual ( ) en la primera línea del código nginx conf allí. Esto funcionó para mí: location = /xmlrpc.php {
Dave
6

Cuando tiene la capacidad de bloquearlo a través de la configuración de su servidor web, las sugerencias de @Charles son buenas.

Si solo puede deshabilitarlo usando php, el xmlrpc_enabledfiltro no es el correcto. Como se documenta aquí: https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/ solo deshabilita los métodos xml rpc que requieren autenticación.

En su lugar, use el xmlrpc_methodsfiltro para deshabilitar todos los métodos:

<?php
// Disable all xml-rpc endpoints
add_filter('xmlrpc_methods', function () {
    return [];
}, PHP_INT_MAX);

Puede probar si funciona enviando una solicitud POST a xmlrpc.php con el contenido siguiente:

<methodCall>
    <methodName>system.listMethods</methodName>
</methodCall>

Si el filtro funciona, solo deben 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://your-wordpress-site.com/xmlrpc.php
tweber
fuente
5

Estamos utilizando el archivo htaccess para protegerlo de los hackers.

# BEGIN protect xmlrpc.php
<files xmlrpc.php>
order allow,deny
deny from all
</files>
# END protect xmlrpc.php
Jorin van Vilsteren
fuente
4

Lo mejor que puede hacer es deshabilitar las xmlrpc.phpfunciones con un complemento en lugar de eliminar o deshabilitar el archivo en sí. El archivo en sí será reemplazado en las actualizaciones principales de WordPress, mientras que un complemento lo mantendrá deshabilitado después de las actualizaciones principales y si cambia los temas.

Consulte https://wordpress.org/plugins/search.php?q=disable+xml-rpc para conocer los diferentes complementos. Todos tienen diferencias menores.

Estos complementos hacen lo mismo que una función agregada al functions.phparchivo del tema o agregando una order,allow denyregla a .htaccess (como se describe en otras respuestas), con la diferencia de que un complemento o función deshabilita las llamadas a xmlrpc.phptravés de PHP, y la regla en .htaccess funciona aprovechando mod_rewrite en el servidor web (es decir, Apache o Nginx). No existe una diferencia de rendimiento apreciable entre el uso de PHP y mod_rewrite en un servidor moderno.

markratledge
fuente
3

Para la minoría extrema que aloja WordPress en IIS, puede usar el módulo IIS URL Rewrite para hacer restricciones similares a las de htaccess. El siguiente ejemplo supone que la verdadera IP del cliente viene en el encabezado X-Fordered-For, la IP de la lista blanca conocida es 55.55.555.555 y que desea responder con un HTTP 404 a las IP que no son de 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="File or directory not found" statusDescription="The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable." />
</rule>
Latón
fuente
0

De la primera manera, puede poner el código add_filter('xmlrpc_enabled', '__return_false');en el archivo functions.phpo en el complemento específico del sitio. Claramente, ponerlo en un sitio específico es más recomendable que editar el archivo functions.php.

y otras formas de eliminar xmlrpc

yaser hamzeloy
fuente
0

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. Poner /xmlrpc.php en la página de Opciones en la lista de direcciones IP de acceso prohibido "Bloquear inmediatamente las IP que acceden a estas URL" ahora muestra un intento de bloqueo cada 15 minutos.

Esto también tiene la ventaja de poder bloquear una URL para escapar de esos molestos bots que vuelven con una dirección IP diferente una y otra vez.

No sé si permite el uso de xmlrpc.php por parte de las aplicaciones para operaciones válidas.

Al principio tuve algunos problemas con la producción de errores 504 Timeout y 502 Bad Gateway en el servidor, pero parece haberse calmado.

Muy impresionado con el resultado hasta ahora y produjo un valioso perfil de limpieza después de que el sitio fue pirateado antes de instalar Wordfence y a pesar de tener siempre la última versión de WordPress y complementos.

Wordfence https://www.wordfence.com/

Steve
fuente
Agregar /xmlrpc.phpa una regla de seguridad que prohíbe las IP que acceden parece que podría bloquear el tráfico legítimo. Si un sitio con pingbacks habilitó enlaces a su sitio, ese sitio enviará una solicitud a esa URL e inmediatamente se bloqueará ... parece que podría causar problemas.
adam-asdf
0

Yo uso para nginx este pequeño código y esto funciona al 100%

location ~* (/wp-content/.*\.php|/wp-includes/.*\.php|/xmlrpc\.php$|/(?:uploads|files)/.*\.php$) {
deny all;
access_log off;
log_not_found off;
return 444;
}
Manuel K
fuente