·

Disabilitare xmlrpc.php su WordPress per bloccare attacchi brute force

L’endpoint xmlrpc.php rappresenta uno dei principali vettori di attacco su WordPress. Costantemente bersagliato da botnet per attacchi brute force amplification e amplificazione DDoS, disabilitarlo alla radice azzera il consumo computazionale su PHP.

Metodo 1: Blocco a livello Web Server (Consigliato)

Intercettare la chiamata sul web server prima che raggiunga PHP azzera il consumo di CPU e RAM, bloccando l’attacco direttamente sul perimetro.

Se il server usa Apache (.htaccess): Inserisci questa direttiva nel file .htaccess nella cartella principale del sito:

# Blocco accesso XML-RPC (Apache 2.4+)
<Files xmlrpc.php>
    Require all denied
</Files>

Se il server usa NGINX: Inserisci questa regola all’interno del blocco server { ... }:

location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
    return 403;
}

Metodo 2: Disattivazione via PHP (Filtro WordPress)

Se non hai accesso ai file di configurazione del web server, puoi disattivare il protocollo direttamente dal core di WordPress. Inserisci questo snippet all’interno di un file .php nella cartella wp-content/mu-plugins/ (es. in hardening.php):

add_filter( 'xmlrpc_enabled', '__return_false' );

Verifica e Collaudo

Per verificare che la protezione sia attiva, apri il terminale ed esegui una chiamata HTTP diretta verso il file:

curl -I -X POST https://tuodominio.it/xmlrpc.php

Se la risposta restituisce lo stato HTTP/1.1 403 Forbidden (o 404 Not Found), il vettore di attacco è bloccato e il server è protetto.

💡 Fuori dal terminale: cosa significa in parole povere?

  • Cos’è xmlrpc.php: È una porta di comunicazione introdotta oltre vent’anni fa per consentire ad applicazioni esterne (come vecchie app per smartphone o servizi di blogging remoto) di interagire con WordPress.
  • Il problema di sicurezza: Oggi è quasi del tutto obsoleta, sostituita dalle moderne REST API, ma rimane attiva di default. I bot la usano per attacchi “ad amplificazione”: con una singola richiesta HTTP possono testare centinaia di combinazioni di password contemporaneamente, saturando la memoria RAM e la CPU del server.
  • La nostra soluzione: Abbiamo chiuso questo canale direttamente a monte sul web server (Apache o NGINX) e tramite filtro PHP. Qualsiasi richiesta diretta viene respinta istantaneamente con un errore 403 Forbidden senza interpellare il database né consumare risorse computazionali.

Daniele Bozza

Unicorn Designer | Web Developer & Security · WordPress & PrestaShop · BozzaDigital

Trasformo siti lenti e vulnerabili in architetture blindate, veloci e prive di plugin commerciali. Il blog su cui stai navigando è il nostro standard: codice pulito, conformità GDPR nativa e Core Web Vitals al 100%.

Disclaimer Tecnico: I comandi di terminale, le architetture e il codice riportati in questo articolo sono forniti a scopo didattico e informativo «così come sono». Prima di applicarli in produzione, testali sempre in un ambiente di staging isolato con backup verificati. Per approfondire, consulta le nostre Note Legali e Disclaimer Tecnico.