Se gestisci un sito WordPress, sai già che prima o poi qualcuno proverà a entrare. Non è paranoia: è statistica. Ogni giorno vediamo centinaia di tentativi di login falliti nei server dei nostri clienti. La maggior parte sono bot che martellano wp-login.php con nomi utente come "admin" e password deboli. Il risultato? Inondano i log, rallentano il server e, se trovano una falla, ti sequestrano il sito.
Noi, di Meteora Web, abbiamo affrontato decine di attacchi brute force su WordPress. Li abbiamo visti arrivare da reti zombie sparse per il mondo, con ritmi di 1000 tentativi al minuto. Abbiamo anche dovuto ripulire siti compromessi — e vi assicuriamo che è molto più costoso prevenire che curare. In questa guida ti mostriamo esattamente come bloccare gli attacchi brute force su wp-login.php con misure concrete, dal .htaccess ai plugin intelligenti, passando per configurazioni server. Nessuna teoria: solo ciò che funziona.
Questa guida è un approfondimento specifico all'interno della nostra Guida Pillar sulla Sicurezza WordPress. Se vuoi una visione completa, parti da lì.
Perché wp-login.php è il bersaglio preferito
WordPress mette la pagina di login in una URL fissa: /wp-login.php. Comoda per noi, comoda per gli attaccanti. Un bot sa esattamente dove bussare. Il primo tentativo è sempre "admin" con password "password" o "123456". Suona banale, ma funziona ancora con un numero spaventoso di siti.
Sponsored Protocol
Un attacco brute force è un tentativo sistematico di provare combinazioni di username e password fino a trovare quella giusta. Può essere:
- Online: il bot invia richieste HTTP a wp-login.php, una dopo l'altra.
- Offline: l'attaccante ha già scaricato il database hash delle password e prova a decifrarle localmente (ma questo richiede una vulnerabilità precedente).
Noi ci concentriamo sulla difesa online, quella che puoi implementare subito.
Il costo di un login non protetto
Ogni richiesta a wp-login.php consuma CPU e memoria. Con 500 tentativi al minuto, un server piccolo può andare in timeout. Ma il danno peggiore è quando l'attacco riesce: l'attaccante installa backdoor, ruba dati clienti, trasforma il tuo sito in un distributore di malware. Ripulire costa ore di lavoro e reputazione. Noi abbiamo visto casi di e-commerce fermo per tre giorni perché l'attaccante aveva cancellato le tabelle dei prodotti.
Prima linea di difesa: .htaccess e IP blocking
Il file .htaccess è il guardiano più veloce. Con poche righe puoi limitare l'accesso a wp-login.php solo a determinati indirizzi IP. Perfetto se sei l'unico admin e hai un IP statico.
Sponsored Protocol
Attenzione: se hai più collaboratori o IP dinamico, questa soluzione diventa un ostacolo. In quel caso usala solo come fallback combinata con altre tecniche.
Bloccare tutti tranne il tuo IP
<Files wp-login.php>
Order deny,allow
Deny from all
Allow from 192.168.1.100
Allow from 203.0.113.0/24
</Files>
Sostituisci gli IP con i tuoi. Puoi specificare più IP o un'intera subnet. Questo è il metodo più semplice — ma se il tuo IP cambia, ti blocchi fuori da solo. Noi lo abbiamo usato per anni su un progetto admin fisso.
Bloccare IP malevoli via .htaccess
Se hai già identificato IP che martellano il login, puoi bloccarli singolarmente:
<Files wp-login.php>
Order Deny,Allow
Deny from 192.0.2.50
Deny from 198.51.100.0/24
Allow from all
</Files>
Questa strategia è manuale e non scala. Per automatizzarla servono i plugin che vedremo dopo.
Seconda linea: Plugin di sicurezza con rate limiting
I plugin per la sicurezza WordPress offrono funzionalità avanzate di rate limiting: dopo un certo numero di tentativi falliti, l'IP viene temporaneamente bloccato. Il più famoso è Wordfence, ma noi abbiamo una preferenza per soluzioni più leggere e mirate.
Sponsored Protocol
Limit Login Attempts Reloaded
Plugin gratuito, leggero, fa solo una cosa e la fa bene. Blocca l'IP dopo N tentativi falliti, con un periodo di blocco configurabile. Non impatta sulle performance.
- Installa e attiva.
- Vai a Impostazioni → Limit Login Attempts.
- Imposta: Max retries = 3, Lockout time = 30 minuti.
- Attiva l'opzione "Notify on lockout" per ricevere email.
Attenzione: i bot più sofisticati usano proxy rotating, quindi ogni tentativo arriva da un IP diverso. Il rate limiting locale non basta: serve un blocco basato su pattern globali.
Wordfence Security
Wordfence ha un firewall integrato che riconosce i pattern di attacco brute force e blocca l'IP a livello globale sulla sua blacklist. Ha anche un meccanismo di CAPTCHA su wp-login.php. Impostalo così:
- Wordfence → Firewall → Rate Limiting: attiva "Immediately block IPs that exceed the login attempt threshold".
- Scegli 3 tentativi in 1 minuto.
- Attiva la protezione CAPTCHA per login.
Parere nostro: Wordfence è potente ma pesante. Su server condivisi può consumare risorse. Preferiamo soluzioni modulari.
Sponsored Protocol
Terza linea: fail2ban a livello server
Se hai accesso SSH al server, fail2ban è la soluzione più robusta. Monitora i log di accesso e blocca gli IP a livello di firewall (iptables/nftables). Nessuna richiesta arriva nemmeno a PHP.
Configurare fail2ban per WordPress
Fail2ban non ha una regola nativa per WordPress. Devi crearla manualmente. Ecco il nostro setup collaudato su centinaia di server:
- Identifica dove WordPress scrive i tentativi falliti. Può essere nel log PHP o in un file custom. Noi usiamo un plugin come WP Security Audit Log che scrive su syslog.
- Crea una regola fail2ban.
# /etc/fail2ban/jail.local
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/php*-error.log
# oppure /var/log/auth.log se usi syslog
maxretry = 3
bantime = 3600
findtime = 300
Poi crea il filtro in /etc/fail2ban/filter.d/wordpress.conf:
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php HTTP/.*" 200
ignoreregex =
Questo blocca qualsiasi IP che fa POST su wp-login.php (anche tentativi riusciti, attenzione). Per una regex più precisa che identifichi solo i fallimenti, devi abbinare il log di WordPress. Molti plugin registrano messaggi come "LOGIN_FAILED" — usa quelli.
Sponsored Protocol
Fail2ban blocca a livello di firewall, quindi anche se l'attacco arriva da 500 IP diversi, dopo 3 tentativi ciascuno viene bannato per un'ora. Noi abbiamo server che ricevono 2000 tentativi al giorno ma fail2ban li blocca al primo colpo.
Quarta linea: nascondere wp-login.php
Una tecnica che divide le opinioni: cambiare la URL di login. Con plugin come WPS Hide Login puoi spostare la pagina di login su un percorso personalizzato, ad esempio /mio-ingresso-segreto. wp-login.php diventa inaccessibile e restituisce 404.
Non è una difesa assoluta: un attaccante può comunque tentare di indovinare il nuovo percorso o usare vulnerabilità XML-RPC. Ma alza la barra e ferma i bot stupidi.
Noi lo usiamo solo su progetti molto esposti, e lo abbiniamo a IP whitelisting. Attenzione: se cambi la URL di login, qualsiasi sistema che chiama direttamente wp-login.php (es. plugin di terze parti) potrebbe rompersi.
Come farlo manualmente (senza plugin)
Puoi modificare il file di template di WordPress, ma è sconsigliato perché ogni aggiornamento lo sovrascrive. Il modo pulito è usare un plugin o un mu-plugin. Ecco un esempio semplice:
Attenzione: questo modifica la logica di routing e può causare incompatibilità. Noi preferiamo affidarci a plugin testati come WPS Hide Login.
Quinta linea: Two-Factor Authentication (2FA)
Anche se la password viene indovinata, il secondo fattore blocca l'accesso. WordPress ha plugin eccellenti per 2FA. Noi consigliamo Two Factor (di Oskar Hane) o Wordfence che lo include.
Configura 2FA obbligatorio per tutti gli utenti con ruolo amministratore. Usa app authenticator (Google Authenticator, Authy) o chiavi hardware (FIDO2). Il brute force diventa inutile perché ogni tentativo richiederebbe anche il codice temporaneo.
Noi abbiamo clienti che hanno implementato 2FA e da allora zero intrusioni via login.
Altre misure complementari
- Disabilitare XML-RPC: molti attacchi brute force sfruttano
xmlrpc.phpper provare password senza toccare wp-login.php. Bloccalo aggiungendo al .htaccess:<Files xmlrpc.php> order deny,allow; deny from all</Files> - Cambiare il nome utente admin: se ancora usi "admin", cambialo. Crea un nuovo utente con ruolo admin e cancella quello vecchio.
- Password forti e uniche: banale ma ancora ignorato. Usa password generate di 16+ caratteri.
- Headers di sicurezza: aggiungi
X-Frame-Options: DENYper prevenire clickjacking che potrebbe simulare il login.
Approfondisci questi temi nella nostra guida su Crittografia e sicurezza dati.
In sintesi — cosa fare adesso
- Controlla i log. SSH nel server e cerca tentativi su wp-login.php. Se vedi migliaia di richieste, l'attacco è in corso.
- Implementa subito il rate limiting. Usa un plugin come Limit Login Attempts Reloaded o Wordfence. Blocca dopo 3 tentativi.
- Se hai accesso al server, configura fail2ban. È la difesa più robusta. Non abbiamo mai visto fail2ban superato da un brute force tradizionale.
- Attiva 2FA per tutti gli admin. Non ci sono scuse: è gratis e facile.
- Rivedi periodicamente le password e disabilita XML-RPC se non lo usi.
La sicurezza non è un'azione singola: è un processo. Noi, di Meteora Web, lo vediamo ogni giorno. Se hai bisogno di una mano per blindare il tuo WordPress, contattaci. Siamo abituati a lavorare anche su progetti già compromessi — ma preferiamo proteggerli prima.