Miglior modo per eliminare xmlrpc.php
Qual è il modo migliore per eliminare il file xmlrpc.php da WordPress quando non ne hai bisogno?

Da WordPress 3.5 questa opzione (XML-RPC
) è abilitata di default, e la possibilità di disattivarla dal dashboard
di WordPress è stata rimossa.
Aggiungi questo snippet di codice da utilizzare nel file functions.php
:
// Disabilita l'uso di XML-RPC
add_filter( 'xmlrpc_enabled', '__return_false' );
// Disabilita X-Pingback nell'header
add_filter( 'wp_headers', 'disable_x_pingback' );
function disable_x_pingback( $headers ) {
unset( $headers['X-Pingback'] );
return $headers;
}
Sebbene faccia ciò che dice, può diventare intensivo quando un sito è sotto attacco ricevendo molte richieste.
Potrebbe essere meglio utilizzare il seguente snippet di codice nel tuo file .htaccess
.
# Blocca le richieste a xmlrpc.php di WordPress
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>
Oppure usa questo per disabilitare l'accesso al file xmlrpc.php
dal blocco server NGINX.
# Blocco richieste xmlrpc.php su nginx
location /xmlrpc.php {
deny all;
}
Tieni presente che la disattivazione può anche avere un impatto sugli accessi da mobile. Se non sbaglio, l'app mobile di WordPress ne ha bisogno.
Vedi Codex per maggiori informazioni sull'uso diXML-RPC
.
- Assicurati sempre di fare un backup dei file prima di modificarli/aggiungerli.
Modifica/Aggiornamento
@Prosti, -hai assolutamente ragione- riguardo alle opzioni che l'RESTful API
offrirà per WordPress!
Ho dimenticato di menzionarlo. Avrebbe dovuto già essere integrato nel core (WordPress versione 4.1) ma non è stato possibile all'epoca. Ma a quanto pare, sarà parte del core in WordPress 4.5.
L'alternativa per il momento è questo plugin: WordPress REST API (Versione 2)
Puoi usarlo finché l'Restful API
non sarà parte del core di WordPress.
Data prevista per il rilascio di WordPress 4.5. (12 aprile 2016 (+3 settimane))
Per chi è interessato a
RESTful
, su Stackoverflow c'è una community wiki molto utile.

Se non sbaglio, l'app mobile di WordPress non ne ha bisogno - probabilmente non sarà più necessario in futuro una volta completata la transizione all'API RESTful di WordPress (WordPress 4.5)

Per chi ancora riceve l'header X-Pingback
per post/pagina singoli. Dobbiamo usare un altro filtro per rimuoverlo completamente: add_filter('pings_open', '__return_false', PHP_INT_MAX);
.

Aggiungere cose del genere a functions.php
farà perdere ogni effetto quando si cambia tema. function.php
è solo per scopi di design, usa un plugin!

@David, certo ma le persone farebbero meglio a usare la cartella mu-plugins, invece di creare un plugin apposito. Quando le persone hanno bisogno/usano una funzione come questa, c'è un motivo e non vogliono che nessuno (neanche un amministratore) abbia la possibilità di disattivare un plugin.

Quando hai la possibilità di bloccarlo tramite la configurazione del tuo server web, i suggerimenti di @Charles sono validi.
Se puoi disabilitarlo solo utilizzando php, il filtro xmlrpc_enabled
non è il modo corretto.
Come documentato qui:
https://developer.wordpress.org/reference/hooks/xmlrpc_enabled/
disabilita solo i metodi xml rpc che richiedono autenticazione.
Invece, utilizza il filtro xmlrpc_methods
per disabilitare tutti i metodi:
<?php
// Disabilita tutti gli endpoint xml-rpc
add_filter('xmlrpc_methods', function () {
return [];
}, PHP_INT_MAX);
Puoi testare se funziona inviando una richiesta POST a xmlrpc.php con il seguente contenuto:
<methodCall>
<methodName>system.listMethods</methodName>
</methodCall>
Se il filtro funziona, dovrebbero rimanere solo 3 metodi:
<?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>
puoi testarlo rapidamente 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

La cosa migliore da fare è disabilitare le funzioni di xmlrpc.php
con un plugin piuttosto che eliminare o disabilitare il file stesso. Il file infatti verrà sostituito con gli aggiornamenti del core di WordPress, mentre un plugin manterrà la disabilitazione anche dopo gli aggiornamenti del core e se cambi tema.
Consulta https://wordpress.org/plugins/search.php?q=disable+xml-rpc per i diversi plugin disponibili. Presentano tutti piccole differenze.
Questi plugin fanno la stessa cosa di una funzione aggiunta al file functions.php
del tema o di una regola order,allow deny
aggiunta a .htaccess (come descritto in altre risposte), con la differenza che un plugin o una funzione disabilitano le chiamate a xmlrpc.php
via PHP, mentre la regola in .htaccess funziona sfruttando mod_rewrite nel webserver (ad esempio Apache o Nginx). Non c'è una differenza apprezzabile nelle prestazioni tra l'uso di PHP e mod_rewrite su un server moderno.

Per l'estrema minoranza che ospita WordPress su IIS, potreste utilizzare il modulo IIS URL Rewrite per implementare restrizioni simili a quelle dell'htaccess. L'esempio seguente presuppone che il vero IP del client arrivi nell'header X-Forwarded-For, che l'IP conosciuto nella whitelist sia 55.55.555.555 e che vogliate rispondere con un HTTP 404 agli IP non presenti in whitelist.
<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="La risorsa che stai cercando potrebbe essere stata rimossa, aver cambiato nome o essere temporaneamente non disponibile." />
</rule>

Il modo migliore è utilizzare il file .htaccess per bloccare tutte le richieste aggiungendo
# Blocca le richieste a xmlrpc.php di WordPress
<Files xmlrpc.php>
order deny,allow
deny from all
allow from 1.1.1.1
</Files>
alla fine del file ma se vuoi il metodo più semplice utilizzando il plugin Disable XML-RPC-API farà al caso tuo.

Ho recentemente installato Wordfence che, a partire dalla versione 6.3.12, ha la capacità di bloccare l'accesso diretto a qualsiasi posizione. Inserendo /xmlrpc.php nella pagina Opzioni all'interno della lista degli IP con accesso vietato "Blocca immediatamente gli IP che accedono a questi URL", ora mostra un tentativo bloccato circa ogni 15 minuti.
Questo ha anche il vantaggio di poter bloccare un URL per sfuggire a quei fastidiosi bot che tornano con un indirizzo IP diverso ripetutamente.
Non so se consente l'uso di xmlrpc.php da parte delle App per operazioni valide.
Inizialmente ho avuto alcuni problemi con la generazione di errori 504 Timeout e 502 Bad Gateway sul server, ma sembra essersi stabilizzato.
Sono molto impressionato dai risultati finora e ha prodotto una preziosa pulizia del profilo dopo che il sito era stato violato prima dell'installazione di Wordfence, nonostante avessi sempre l'ultima versione di WordPress e dei plugin.

Aggiungere /xmlrpc.php
a una regola di sicurezza che banna gli IP che vi accedono sembra possa bloccare traffico legittimo. Se un sito con i pingback abilitati si collega al tuo sito, quel sito invierà una richiesta a quell'URL e verrà immediatamente bloccato... sembra possa causare problemi.

Utilizzo di un Plugin di Sicurezza (Consigliato):
Uno dei modi più semplici per bloccare l'accesso a xmlrpc.php in WordPress è utilizzare un plugin di sicurezza come Wordfence
o Sucuri Security
. Questi plugin spesso includono opzioni per bloccare XML-RPC o file specifici come xmlrpc.php.
Utilizzo di Regole Lato Server Apache
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Utilizzo di Regole Lato Server Nginx
location ~* /xmlrpc.php {
deny all;
access_log off;
log_not_found off;
}
Ricarica Nginx
sudo systemctl reload nginx
Disabilita XML-RPC tramite wp-config.php:
define('XMLRPC_REQUEST', false);
