12, Mar 2023
Pulire un WordPress infetto e recuperare posizionamento
Un sito infetto, Prima di farlo do uno sguardo ai diversi siti monitorati e uno in particolare, a seguito di aggiornamento della scansione di SEOZoom mi mostra un brutto drop sia nelle query monitorate che in alcune generali.
Al volo, tra i fumi della febbre, reputo che il drop sia dovuto al fatto che è da troppo tempo che il sito non viene aggiornato nei contenuti e che non riceve abbastanza link in ingresso.
Potrebbe essere, il sito in questione di una associazione di professionisti locali è stabile da mesi per le query relative alla sua attività (in prima pagina), ma purtroppo è uno di quelli dove il consulente SEO (ossia io) non ha completa autonomia nella realizzazione dei contenuti (ovvero a seguito di pianificazione farli poi realizzare da un copy) ma i clienti hanno emesso un dictat del tipo: te ci fornisci piano redazionale e scaletta per ogni articolo e noi scriviamo. Cosa che ad inizio anno preparo per i mesi a venire, ma in questo caso è da parecchio tempo che si è bloccata e da novembre 2017 non mandano più nulla. Per cui di mio posso solo fare attività di fine tuning e monitoraggio passivo dell’andamento.
Al cliente però va bene così e quindi di mio non martello (anche perché l’ho già fatto più volte fino a sentirmi dire: “Ok abbiamo capito ma abbiamo altro da fare, siamo consapevoli, il tuo dovere l’hai fatto“). Del resto paga lo stesso e da quel che dice è contento di quello che il sito produce (lead acquisition).
A livello di link ho esaurito il budget stanziato per procuramene di nuovi (budget tra l’altro decisamente infimo rispetto al minimo che si dovrebbe fare) e per questo motivo ecco lasciato un ottimo dominio in balia dei venti della SEO, pregando che nessun competitor faccia qualcosa di meglio per scalzarlo dalle posizioni acquisite con il tempo.
Ma ritorniamo al problema. Il sito è pesantemente sceso ed io non posso però fare ulteriori analisi, non ne ho le facoltà causa febbre ed allora mi butto a letto tra le braccia di Morfeo, che mi fa passare una calda e umida notte, bagnato di febbricitanti sudori.
Negative #SEO: pulire un #wordpress infetto da url spam e recuperare il posizionamento perso Condividi il Tweet
Al mattino mi sveglio che sto lievemente meglio, e pur febbricitante provo a ragionare su questo drop.
Analisi della perdita di posizionamento dovuta a Negative SEO
Davanti ad un monitor qualcosa non quadra, il drop di posizionamento è troppo elevato per essere imputabile ad una naturale flessione della SERP per le query posizionate e memore di precedenti esperienze ricerco le cause in uno dei tre ambiti:
- il sito ha dei problemi tecnici
- Google ha lanciato un nuovo algoritmo
- il dominio si è beccato una azione manuale
Ed allora raccolgo i dati.
Ok sono scese alcune query posizionate (pesantemente e solo per alcuni url) ma il traffico in realtà? Guardo Analytics e fino a giovedì mattina, prima del drop evidenziato da SEOZoom, tutto a posto (poi dal venerdì mi renderò conto che alla sera è lievemente sceso rispetto alla settimana precedente). Tutto è complicato dal fatto che il sito effettua pochi accessi da organico, per cui le flessioni di visite non spiccano.
Analizzando nel dettaglio mi rendo conto che ad essere scesa di posizionamento è la home e alcuni URL.
Seconda riflessione: Ma che davvero il dominio si è preso una botta per scendere in maniera così pesante a causa dello scarso aggiornamento e solo per alcuni URL?
Aggiornamenti algoritmici non ve ne sono, Search Console non ha azioni manuali, i contenuti non vengono modificati da tempo (no Panda granulare), non ho acquistato link e non ve ne sono di nuovi in ingresso (no Penguin granulare), quindi vi sono problemi tecnici.
Incominciamo a guardare sul sito.
Ok non è lo scarso aggiornamento dei contenuti, mi hanno bucato il WP, ma come diavolo hanno fatto dato che questo l’ho aggiornato (tema e plugin) completamente meno di un mese fa e che non vi sono nuovi aggiornamenti?
un server condiviso con un altro WP fantasma, progetto mai partito e a quanto pare abbandonato da tempo, con un WP decisamente obsoleto che risponde ad un dominio non utilizzato!
Quindi hanno bucato il WP fantasma e da li sono saliti di radice, hanno visto cosa c’era e sono scesi a bucare questo dominio. Mannaggia al sistemista.
rm -rf /dominiomaiusato.it
Ok ora in teoria non possono più entrare, ma ora tocca analizzare il sito bucato e comprendere cosa è successo.
Tramite il comando site scopro due cose:
- i title/description di alcuni url esistenti sono tutti modificati in giappocinese e con testo spammoso
- google ha indicizzato un macello di risultati spam, con url, title e description giappocinemmosi (giapponesi/cinesi e spammosi)
Controllo quindi subito il database, che è pulito.
Quindi?
La sitemap com’è?
Quella generata da yoast è a posto, ma… com’è sta storia che anche nel file robots.txt si punta ad un’altra sitemap rispetto a quella che viene generata da yoast?
Perchè da search console mi dice che vi sono errori nella sitemap? (sitemap in html e per questo non processabile)
Ok quindi l’attacco è stato portato in questa maniera: semplice generazione di un macello di pagine spam, sostituzione di sitemap e notifica a Google mediante redirect da quella originale.
Ma come è stato portato in pratica questo attacco?
Analizzo i file dentro l’host e scopro che l’.htaccess è stato infettato, aggiungendo una regola per far effettuare un redirect alla sitemap spammosa del sito (generate dinamicamente secondo un algoritmo criptato) e in più il file robots.txt è stato modificato ed ora linka la nuova sitemap spam e…
Ta da! Anche in questo dominio ci sono due maledette backdoor! Di quelle che possono essere usate come file manager, per cancellare, caricare e modificare permessi sui file, chiaramente a tutto l’host, che se frazionato su più domini li rende tutti vulnerabili a questa tipologia di azione. Si insomma delle webshell in php, ci siamo capiti, quelle che si possono anche realizzare in autonomia utilizzando la funzione exec().
Analizzo quindi i log del webserver, ora che so i nomi dei file .php utilizzati come backdoor, e vado a scoprire che esattamente giovedì 31, nelle prime ore del mattino, qualcuno tramite un proxy cinese ha fatto accesso a quei file e chiaramente avrà caricato questi script.
Quindi è necessario pulire il sito e per farlo non scelgo di usare un plugin (perché spesso non riescono a pulire e alcune volte nemmeno a rilevare le falle di sicurezza) ma procedo con un metodo ben più drastico e sicuro.
Come pulire un WordPress infetto
Attenzione, la procedura a seguire è decisamente completa e veloce, ma solo se si sa dove mettere le mani.
Chiaramente prevede che abbiate una versione di backup del vostro sito, ma del resto tutti voi l’avete no?
- backup del db del sito online che non si sa mai
- backup dei file del sito online che non si sa mai
- analisi della cartella media in cerca di file sospetti e/o caricati nel momento dell’attacco
- cancellare tutto, tranne i media di WordPress
- modificare i parametri di accesso al db (quelli scritti in wp-config.php giusto per intenderci)
- modificare il file wp-config.php con i nuovi accessi al db
- caricare una versione pulita e aggiornata di wordpress
- caricare il tema aggiornato all’ultima versione (preso da un backup locale del sito)
- caricare nuovamente i plugin
- modificare le password di accesso degli utenti WP
- rigenerare i permalink
- rigenerare la sitemap
- controllare che tutto sia a posto (veloce navigata nel sito e passaggio di Screaming Frog/Visual SEO Studio in cerca di errori)
- controllare che tutti i risultati spam caschino in una corretta pagina 404 (con http status 404). Questo in realtà basta ma se proprio volete fare le cose bene in realtà l’http status code dovrà essere 410 ossia risorsa non più esistente e che NON lo sarà in futuro.
Come avrete capito tutto ciò presuppone che il dominio vada offline per un tempo variabile, in base alla vostra connessione (tempo di caricamento dei file via ftp).
Si può evitare tutto ciò, o meglio diminuire i tempi di offline, con qualche accortezza:
- precaricare i file in una directory temporanea e poi spostare tutto via terminale (comando mv da shell linux)
- cancellare i file da terminale (comando rm)
- mettere una splash screen di lavori in corso
Con una connessione a Fibra comunque ricaricare un WordPress è questione di meno di mezz’ora a patto di non cancellare i media, che il tema in uso non sia una roba immonda con millemila file (e che quindi avete altri problemi SEO a prescindere) e che non abbiate in uso una valangata di plugin (e che forse andrebbero potati).
Dopo la pulizia del sito in WordPress, lato SEO
Dopo aver effettuato la pulizia del WordPress bisogna effettuare due operazioni:
- comunicare a Google che i contenuti del sito sono stati aggiornati
- (in teoria) pulire tutti i risultati spam indicizzati
Comunicare che gli URL del sito non sono più spam a Google
Facilissimo, basta reinviare la sitemap a Search Console, per segnalare al motore di ricerca di effettuare una nuova scansione del dominio (dalla vecchia GSC: selezione della proprietà desiderata > Scansione > Sitemap > Aggiungi/testa sitemap).
Poi analizzate i log del server per vedere il passaggio del crawler. Se non ne siete capaci cercate di diventarlo! A parte gli scherzi, sappiate che seolyzer.io aiuta parecchio per incominciare.
Pulire il motore di ricerca dai risultati infetti/spam relativi al nostro dominio
In teoria ora è necessario pulire i risultati spam in SERP e a seguire vi spiego alcuni metodi.
Attenzione! Dato che sono risultati SPAM, con roba tipo Cialis, Viagra et Louis Vuitton gli URL spam non più esistenti non devono venire rediretti a pagine del sito o alla home, ma alla 404.
Vi anticipo subito che però questa azione ad ora è molto meno utile rispetto al passato. Google è diventato decisamente più intelligente.
Se siete quindi curiosi di scoprire i miei esperimenti su questo aspetto continuate a leggere, altrimenti saltate pure questo paragrafo e andate a seguire dove vi racconto le mie considerazioni su questo aspetto.
Estrarre gli URL da eliminare
Prima di segnalare a Google quali URL eliminare è necessario averne una lista.
Per farlo il modo migliore e più veloce è crawlare il sito compromesso, con uno strumento come Screaming Frog/Visual SEO studio, escludendo poi gli URL utili o nel mio caso direttamente la sitemap spam.
Purtroppo però di mio, causa annebbiamento da febbre, non ho fatto questa operazione prima di procedere alla pulizia e per questo ho dovuto ricostruire la lista di URL spam mediante scraping della SERP di Google restituita dal comando site.
C’è un però: il comando site non restituisce tutti i risultati e nel mio caso di oltre 5000 spamsnippet (perchè ho fermato in tempo l’infezione, in altri casi mi sono trovato con 70000 url spam) me ne tira fuori un massimo di 10 per circa 40 pagine, ovvero 400.
Scrapare la SERP di Google per una data query o operatore di ricerca
Questa operazione va chiaramente automatizzata, già solo copiaincollare a manina 400 risultati porta via troppo tempo e se va ripetuta nel tempo…
Per procedere i metodi sono differenti e ad esempio si potrebbe:
Vi dico sin da subito che:
- realizzare lo script porta più tempo che usare una estensione per Chrome
- utilizzare un software di automazione, se non si conosce lo strumento, porta via una valanga di tempo per impadronirsi del linguaggio di codice proprietario (ma che è un ottimo investimento per riutilizzarlo per automatizzare funzioni ricursive se si effettuano periodicamente)
Quindi di mio ho utilizzato l’estensione per Chrome Data Miner.
Dopo averla installata ho quindi aperto una nuova finestra del browser ed ho effettuato il comando site://nomedominio.
Facendo attenzione a rimanere sulla prima pagina della paginazione ho quindi configurato il tool affinché scrapasse tutti i risultati delle “pagine paginate“.
Per farlo ho premuto sul bottone Next Page e ho impostato a 100 il valore in Scrape X pages before stopping, per poi premere il bottone Start Pagination.
Il tool ha poi estratto tutti i risultati (vedrete che funziona perché pian piano naviga tutte le pagine della paginazione) e a seguire ho tirato giù un csv, trasformato poi in un file txt.
Ho quindi usato la funzione della Search Console Indice di Google > Rimozione URL che però nativamente accetta in pasto un solo URL per volta.
Per questo ho investito una enorme cifra (tipo un euro e qualcosa) per acquistare una estensione per Chrome, Webmaster Tools – Bulk URL Remover che aggiunge la possibilità di dare in pasto al tool una lista di url all’interno di un file.
Il file va generato come file testuale semplice e a capo ogni url che si vuole rimuovere.
Ho così dato in pasto un txt con tutti gli url da eliminare, facendo prima una prova.
Purtroppo però la search console in alcuni casi e dopo circa 50 url dati in pasto con questo metodo si pianta e fornisce un bel messaggio di errore (You have exceeded your quota limit!). In quel caso è necessario quindi effettuare un reload della pagina riaprendo la search console, la proprietà su cui si vuole lavorare e spostarsi nuovamente in Indice di Google > Rimozione URL. IL software poi ricomincia il lavoro da dove è si è interrotto.
E qui ho scoperto una cosina. Ossia che lo strumento rimozione URL accetta massimo 1000 url/giorno e poi si blocca.
Il tempo per eseguire questa operazione si allunga di conseguenza un sacco, e per questo non bene, in particolare quando (come in questo caso) non vi è budget.
Quindi dopo aver analizzato il posizionamento ed essermi reso conto che le precedenti posizioni erano state recuperate ho lasciato perdere tutto il lavoro di pulizia ed ho scoperto una nuova cosa.
Perchè non serve pulire i contenuti indicizzati di un sito Bucato
Google è decisamente diventato più intelligente e un eventuale lavoro di pulizia di risultati Spam può essere evitato!
Dico questo perchè:
- Il dominio dopo circa 20 giorni ha ripreso le precedenti posizioni perse
- I risultati spam non hanno portato traffico, dato che non si sono posizionati (per gli stessi motivi per cui un contenuto off-topic e in un layout totalmente differente dal resto del sito non si posizionano)
- Google ha comunque tenuto in indice i risultati e li ha riscansionati, capendo (grazie alla risposta 404) che erano contenuto non più esistente e pian piano li ha segnalati su Search Console, dove con due click si possono contrassegnare come corretti
- Tutti i competitor che effettueranno una analisi del dominio si ritroveranno spiazzati
Errore 404 VS 410
L’errore 404 è il più comune e quando viene rilasciato questo status code andiamo a spiegare allo spider o all’utente che PER ORA la risorsa non è disponibile ma che potrebbe esserlo in futuro.
In questo caso quindi sarebbe meglio per gli url spam non più esistenti, andare a rilasciare come status di errore il 410 (contenuto non più esistente e che NON lo sarà mai più).
Per farlo però avrei dovuto realizzare una regex e intervenire sull’htaccess che in questo caso mi sembrava un deciso spreco di energie non pagate, ma voi ricordatelo per il futuro!
Analisi del recupero del posizionamento perso
Dopo aver effettuato la pulizia di WordPress dai risultati infetti nei giorni a seguire ho monitorato l’andamento del sito grazie a:
- SEOZoom: che mi ha segnalato come le posizioni per le query monitorate erano state recuperate (lo strumento permette di comprendere prima di tutti l’andamento del dominio, perché se un risultato è posizionato o meno per una data query porterà più o meno traffico in futuro)
- Google Analytics: che mi ha segnalato un lieve drop (che poteva diventare decisamente più elevato se non risolto il problema per tempo)
- Search Console: che dopo i classici tre giorni di differita mi ha incominciato a mostrare impression sui nuovi url spam
- Search Console: che (sempre dopo i tre giorni) mi ha mostrato un deciso drop di impression/click su uno degli url per cui avevo perso il posizionamento
Globalmente però, per questo caso, rimane uno strumento come SEOZoom il più veloce per accorgersi di un problema di tipo, dato che il drop è stato così breve che un tool come Search Console (che mostra dati a tre giorni prima) non può monitorare e Analytics nel mare di URL che monitora potrebbe non mostrare un drop di accessi al sito così significativo per essere scoperto se non dopo qualche giorno.
Anzi vi dico di più, data la velocità con cui ho risolto la cosa non ho ricevuto nessuna notifica per sito compromesso in Google Search Console ma solo di aumento delle pagine 404 del sito dopo il lavoro di pulizia.
E qui concludo, chiaramente nei commenti a seguire se avete dubbi, perplessità e curiosità non esitate a chiedere.
Di mio il mio consiglio principale per risolvere un problema simile è… di non ammalarvi! Se riguardo indietro i miei passi mi rendo conto di aver fatto mille cappellate in quei giorni di febbre, fra cui tenere traccia delle azioni eseguite a pezzi e non in maniera completa (ecco perchè è un po nebuloso questo ar
ticolo, per alcuni aspetti sono andato a memoria sulla base di quanto mi ero segnato mesi fa).
- 0
- By Roberto Ercolese