Se il tuo WordPress reindirizza gli utenti verso siti sconosciuti (spesso solo su mobile o al primo click), è probabile una compromissione. Qui trovi una procedura operativa, passo-passo, per bloccare il danno, ripulire file e database e mettere in sicurezza il sito.
TL;DR
- Metti in sicurezza: backup immediato, disattiva cache/CDN, abilita 2FA, cambia password.
- Trova l’origine: controlla
.htaccess,wp-config.php, uploads, mu-plugins, plugin/tema, DB (wp_options,wp_posts). - Pulisci: rimuovi codice offuscato (
base64_decode,gzinflate,eval), ripristina core/plugin da sorgenti ufficiali. - Ruota chiavi (SALTS), reset password, blocca PHP in
/uploads, aggiorna tutto. - Verifica: cancella cache, controlla Search Console (Sicurezza), monitora 48–72h.
1) Metti in sicurezza (prima di toccare i file)
- Backup completo di file + database (serve copia “forense”).
- Disattiva cache (plugin e CDN) per non servire versioni infette da cache.
- Attiva 2FA e cambia password di: WordPress (tutti gli admin), hosting, FTP/SSH, DB, CDN.
- Controlla DNS: record A/AAAA/CNAME non modificati.
2) Riconosci il pattern di redirect
- Capita solo su mobile/Android o al primo pageview? È tipico di script che usano
localStorage/cookieper “one-time redirect”. - Si attiva su specifiche URL o al click? Spesso è iniettato in footer o widget.
3) Punti caldi da controllare
- .htaccess (Apache): regole
Rewritesospette verso domini esterni. - wp-config.php: includes strani (soprattutto a inizio/fine file) o costanti aggiunte.
- /wp-content/uploads/: presenza di
.php(sospetto), soprattutto in uploads/anno/mese. - /wp-content/mu-plugins/: file auto-caricati con codice offuscato.
- Plugin/tema: file modificati di recente o con timestamp anomali.
- Database:
wp_options(opzioni serializzate con JS offuscato),wp_posts(iframes/script),siteurl/homealterati.
4) Comandi utili per trovare l’infezione (SSH)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# Cerca funzioni tipiche di obfuscation/backdoor grep -R --line-number -E "base64_decode|gzinflate|str_rot13|eval\(|assert\(|preg_replace\(.*/e" wp-content # Trova file PHP in uploads (sospetti) find wp-content/uploads -type f -iname "*.php" -ls # File modificati di recente (ultimi 3 giorni) find . -type f -mtime -3 -ls | grep -E "wp-content|wp-includes|wp-admin" # Inclusioni sospette in wp-config.php grep -n "include\|require" wp-config.php |
5) Ripristino di core, tema e plugin
- Reinstalla il core da sorgente ufficiale (nessun file custom nel core):
1wp core download --force
- Ripristina plugin/tema reinstallandoli:
Evita di “riparare” manualmente file compromessi: più sicuro sovrascriverli da fonte pulita.12345# Plugin (esempio)wp plugin reinstall --all --force# Tema attivo (sostituisci slug)wp theme install twentytwentyfive --force
6) Pulisci .htaccess e Nginx
Default WordPress (.htaccess):
|
1 2 3 4 5 6 7 8 9 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> |
Nginx: verifica che non ci siano rewrite verso domini esterni e che gli snippet siano standard del tema/hosting.
7) Pulisci il database
- Controlla
wp_options:siteurlehomedevono puntare al tuo dominio; ispezionawidget_*e opzioni personalizzate con script. - Query di ricerca (adatta il prefisso tabelle):
|
1 2 3 4 5 6 7 8 |
SELECT option_name, LEFT(option_value, 200) FROM wp_options WHERE option_value REGEXP '(base64|<script|iframe|eval\()'; SELECT ID, post_type, LEFT(post_content, 200) FROM wp_posts WHERE post_content REGEXP '(base64|<script|iframe|eval\()'; |
8) Ruota le chiavi e blocca PHP in uploads
|
1 2 3 4 |
// wp-config.php — rigenera le SALTS dal generatore ufficiale define('DISALLOW_FILE_EDIT', true); define('FORCE_SSL_ADMIN', true); |
Blocca PHP in /uploads:
Apache (.htaccess):
|
1 |
<FilesMatch "\.php$">Deny from all</FilesMatch> |
Nginx:
|
1 |
location ~* ^/wp-content/uploads/.*\.php$ { return 403; } |
9) Verifiche post-pulizia
- Svuota cache (plugin + CDN), riabilita gradualmente le ottimizzazioni.
- Chrome DevTools → Network: nessuna chiamata a domini sconosciuti, nessun inline script sospetto.
- Google Search Console → Sicurezza: verifica e richiedi revisione se c’erano avvisi.
- Monitora 48–72h (anche da mobile/reti diverse).
Dove si nasconde il redirect? (mappa rapida)
| Posizione tipica | Segnale | Fix |
|---|---|---|
.htaccess |
RewriteRule verso domini esterni |
Ripristina snippet standard di WordPress |
wp-config.php |
include a file nascosti (es. in wp-includes) |
Rimuovi include, reinstalla core, ruota SALTS |
/uploads/ |
File .php tra immagini |
Elimina, blocca PHP in uploads |
| mu-plugins / plugin | Codice offuscato, timestamp anomali | Reinstallazione da fonte ufficiale |
DB (wp_options / wp_posts) |
Script/iframe in opzioni o contenuti | Pulizia mirata, ripristino da backup precedente |
Prevenzione (dopo la pulizia)
- Aggiornamenti cadenzati (core/tema/plugin) + staging per test.
- Principio del minimo privilegio + 2FA per account elevati.
- Backup off-site con restore test periodico.
- WAF (applicativo o edge) e rate-limit su login/XML-RPC.
- Regole cache sicure per WooCommerce e controllo webhook.
Ti occorre una rimozione virus da WordPress ed una messa in sicurezza robusta? Posso analizzare log/file/DB, rimuovere i backdoor, ripristinare core/plugin e mettere in sicurezza il sito.
Programmatore WordPress Esperto WooCommerce
Sono l’autore di questo blog con tanti trucchi e guide su WordPress e WooCommerce.



