Bad Bots: come bloccare i crawler che possono danneggiare il nostro sito web
I bots, o crawler, o spider, sono dei "programmi" che scansionano il contenuto di un sito web in modo automatico, normalmente per conto di un motore di ricerca.
Alcuni bots sono sicuramente utili, come quelli di Google o di Bing o di altri motori di ricerca.
Altri invece sono dannosi per il nostro sito web perchè possono causare dei rallentamenti, saturando risorse del server, e potrebbero addirittura causare il blocco nel caso in cui più bots "lavorassero" in modo intenso nello stesso momento.
Prima di capire come bloccare un bot, dobbiamo capire come riconoscerlo.
Come riconosciamo un bot?
I bot si riconoscono dal loro user agent: quando un utente naviga sul nostro sito, così come un bot, tra le tracce che lascia della sua navigazione è presente una stringa che contiene alcune informazioni tra cui il browser utilizzato, il sistema operativo, la lingua.
Ad esempio, se un utente navigasse da PC windows, usando come browser Firefox, lo user agent potrebbe essere questo
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0
Un bot utilizza una stringa specifica, e grazie a questa stringa possiamo distinguere tra la navigazione di un utente normale, ed un bot.
Ad esempio Google bot, che serve a Google per scansiare i siti ed indicizzare le relative pagine, si presenta con questo user agent
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
oppure con questo
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html)
o più raramente con questo
Googlebot/2.1 (+http://www.google.com/bot.html)
Google ha vari bot, oltre a questo, esiste il bot per indicizzare le immagini, i video, il bot per google news....
Ad esempio il bot di BING normalmente si presenta così
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
Come possiamo vedere la stringa contiene la parola "bot", per cui possiamo identificarli abbastanza facilmente, dico abbastanza perchè esistono putroppo bot che non hanno questa parola nello user agent (tuttavia i bot più importanti ce l'hanno).
Quanti bot esistono? Migliaia!!!
Se tutti agissero allo stesso momento saturerebbero le risorse del nostro server, rallentandolo o addirittura bloccandolo.
Per cui, come prima cosa, è importante monitorare gli accessi e capire se ci sono bot che periodicamente scansionano il nostro sito web, capire se è un bot "buono" o "cattivo", ed eventualmente bloccare i bot cattivi.
Quali sono i bot cattivi?
Non è facile parlare male di qualcuno, ma se qualcuno ci danneggia allora dobbiamo reagire.
Alcuni bad bot sono noti, altri meno perchè possono nascere da giorno all'altro. Se siete programmatori/sistemisti potreste creare voi stessi un bot.
Alcuni bot non sono veramente "cattivi" ma, potrebbero non essere utili al nostro sito (ad esempio un bot russo come Yandex, se i vostro target non è la russia) e scansionando di frequente il nostro sito web potrebbe rallentarlo. Per cui potreste volerli bloccare.
Per conoscere le liste aggiornate dei bot, cercate su Google "list bad bots" o "list user agent" o frasi simili.
Di seguito vi presento due modi per fermare i bots: il primo meno aggressivo, il secondo molto più hard.
Bloccare i bad bot attraverso il file robots.txt
Il file "robots.txt", posizionato nella root del sito, informa i bot su cosa indicizzare e su cosa no, ma indica anche quali bot non fare accedere all'intero sito, o ad alcune sezioni o pagine.
Ad esempio per bloccare l'indicizzazione di tutto il sito, da tutti i bot, utilizziamo
User-agent: *
Disallow: /
Ma così facendo bloccheremmo anche Google e Bing!
Per bloccare solo uno specifico user agent, ad esempio il bot che si chiama "AhrefsBot", utilizziamo
User-agent: AhrefsBot
Disallow: /
Per bloccare ad esempio "AhrefsBot" e "Baidu Spider"
User-agent: AhrefsBot
Disallow: /
User-agent: Baidu Spider
Disallow: /
Dovremmo quindi avere una lista di user agent "cattivi", o che reputiamo tali, e creare una lista da inserire nel file robots.txt
In allegato, a fondo articolo, abbiamo inserito un file contentente una lista da copiare/incollare nel vostro file robots.txt.
Attenzione, è una lista molto ampia, che esclude molti bot e motori di ricerca: controllate questa lista e siate certi che non ci siano bot che invece ritenete utili al vostro sito, ad esempio Yandex che è un noto motore di ricerca russo.
Utilizzare un file robots.txt per bloccare l'accesso di un bot, è una metodo "soft", in quando se un bot è davvero un bad bot... non rispetta le regole, per cui non tiene conto di questo file. In questo caso dobbiamo usare le maniere forti ed un utilizzare un metodo "hard".
Bloccare i bad bot attraverso il file .htaccess
A differenza del metodo "soft" del file robots, utilizzare htaccess significa "bannare" uno user agent dalla navigazione/scansione del nostro sito.
Il file ".htaccess" è localizzato nella root del sito.
Un esempio di codice, che blocca quattro user agent, è il seguente
<IfModule mod_setenvif.c>
SetEnvIfNoCase User-Agent "^12soso.*" bad_bot
SetEnvIfNoCase User-Agent "^192.comAgent.*" bad_bot
SetEnvIfNoCase User-Agent "^1Noonbot.*" bad_bot
SetEnvIfNoCase User-Agent "^1on1searchBot.*" bad_bot
<Limit GET POST PUT>
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</Limit>
</IfModule>
Anche in questo caso, occorre inserire una riga per ogni user agen che vogliamo bloccare.
A fondo articolo ho inserito un file contiene un esempio di codice da copiare/incollare nel nostro file .htaccess, utilizzando le stesse avvertenze usate per il file robots.txt
NOTA: se avete accesso al server, come utente root, per cui potete modicare il file di configurazione del vostro server web potreste inserire questo codice direttamente in questo file.
Se ad esempio utilizzate il webserver Apache con una distribuzione CentOS, il file di configurazione è localizzato qui: "/etc/httpd/conf/httpd.conf"
Per concludere.
Come detto, i bots si aggiornano frequentemente, per cui, se possibile e se potete, monitorare periodicamente l'accesso al vostro sito, verificando la presenza di bots di cui non gradite la presenza, e tenete la vostra lista aggiornata.
Presento un esempio di script in PHP per individuare, analizzando la variabile $_SERVER['HTTP_USER_AGENT'], la presenza di un bot, basandosi sulla presenza di alcune parole "chiave", come "bot", "crawler", "spider",... Questa funzione restituisce TRUE se individua un bot.
Non è un metodo preciso, ma un buon inizio per la vostra ricerca.
<?php
function detect_crawler($user_agent) {
// User lowercase string for comparison.
$user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
// A list of some common words used only for bots and crawlers.
$bot_identifiers = array(
'bot',
'slurp',
'crawler',
'spider',
'curl',
'facebook',
'fetch',
);
// See if one of the identifiers is in the UA string.
foreach ($bot_identifiers as $identifier) {
if (stripos($user_agent, $identifier) !== FALSE) {
return TRUE;
}
}
return FALSE;
}