HTML5 - CSS 2.x/3
PHP / MySQL
FORTH ...

Bloquer les bots indésirables

Les robots d'indexation inutiles sont une vraie plaie. Ils peuvent représenter 30 à 50% du trafic d'un site web.

Une solution simple

Comme nous l'avons vu dans l'article analyse du contenu du fichier de traçage, nous pouvons suspecter tout user-agent contenant le mot bot ou crawl d'être un robot d'indexation.

Exemple:

"185.53.44.118";01/03/2015 22:29:38;/profil/profil/article/profil/sortie/sortie/profil/contact/index/article/article/SortiesEntreAmis_LaPhilosophieDuSite;;Mozilla/5.0 (compatible; XoviBot/2.0; +http://www.xovibot.net/)

Ici, le pseudo user-agent XoviBot qui contient bien bot

Autre exemple:

"104.154.91.27";26/02/2015 12:30:49;/;;Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+)

Ici, le pseudo user-agent MJ12bot qui contient bien bot

Dernier exemple:

"198.27.80.144";16/10/2014 10:22:21;/sortie/detail/id/185;;Mozilla/5.0 (compatible; ca-crawler/1.0)

Ici, le pseudo ca-crawler MJ12bot qui contient bien crawl

Blocage de bots bien particuliers

Nous pourrions à priori bloquer toutes les connexions entrantes identifiées par leur user-agent contenant bot ou crawl. Ce serait trop simple, car si on procède ainsi, nous bloquerions également les bons robots d'indexation (Google, Bing, etc...).

En analysant sur plusieurs jours le contenu de différents fichiers de traçage, nous constatons que XoviBot sera l'identifiant spécifique d'un seul robot d'indexation indésirable. On va donc créer une table:

$unwanted = array(   
    "xovibot", // XoviBot/2.0; +http://www.xovibot.net/)
);

Si nous voulons rajouter MJ12bot:

$unwanted = array(   
    "mj12bot", // MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+)
    "xovibot", // XoviBot/2.0; +http://www.xovibot.net/)
);

Dans ce tableau, nous allons enregistrer une valeur qui correspond à une chaîne identifiant spécifiquement un moteur d'indexation, valeur en caractères minuscules:

Classez ces valeurs par ordre alphabétique au fur et à mesure que vous les détectez. Mettez en commentaire sur la même ligne la partie signature de l'user-agent du robot d'indexation.

La boucle de blocage

Nous allons utiliser le contenu de ce tableau au travers d'une boucle de blocage:

foreach ($unwanted AS $val) {
    if (stristr($_SERVER['HTTP_USER_AGENT'], $val) != FALSE) {
        header("HTTP/1.0 404 Not Found");
        readfile('404missing.html');
        die;
    }
}

En fait, ce script est très simple. Il cherche si chaque valeur du tableau $unwanted apparaît dans la chaine remontée par $_SERVER['HTTP_USER_AGENT'], ceci sans tenir compte des différences minuscules/majuscules.

Pour notre tableau $unwanted, il cherchera mj12bot puis xovibot dans le user-agent. S'il trouve, il renvoie vers le contenu du fichier 404missing.html et interrompt le script en cours.

Le script complet

Le script complet est donné ici à titre d'exemple. Copiez ce code et mettez-le dans un fichier nommé unwantedBots.php que vous placez ensuite à la racine de votre site web.

Le script de blocage des robots d'indexation indésirables:

<?php
$httpUserAgent = null;
if(isset($_SERVER['HTTP_USER_AGENT'])) {
    $httpUserAgent = $_SERVER['HTTP_USER_AGENT'];
 
    $unwanted = array(   
        "007ac9",       // Mozilla/5.0 (compatible; 007ac9 Crawler; http://crawler.007ac9.net/)
        "7zap",         // http://volkswagen.7zap.com/;Mozilla/4.61 [en] (X11; U; ) - BrowseX (2.0.0 Windows)
        "admantx",      // ADmantX Platform Semantic Analyzer - ADmantX Inc. - www.admantx.com - support@admantx.com
        "ahrefsbot",    // Mozilla/5.0 (compatible; AhrefsBot/5.0; +http://ahrefs.com/robot/)
        "archive-org.com", 
        "baiduspider",  // Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
        "betabot",      // betaBot
        "blexbot",      // Mozilla/5.0 (compatible; BLEXBot/1.0; +http://webmeup-crawler.com/)
        "ccbot",        // CCBot/2.0 (http://commoncrawl.org/faq/)
        "cmscrawler",   // Mozilla/4.0 (CMS Crawler: http://www.cmscrawler.com)
        "contextad bot", // ContextAd Bot 1.0
        "cognitiveseo", // Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.10) Gecko/20050716 Thunderbird/1.0.6 - WebCrawler http://cognitiveseo.com/bot.html
        "crystalsemantics", // CrystalSemanticsBot http://www.crystalsemantics.com/service-navigation/imprint/useragent/)
        "domainoptima", // http://www.domainoptima.com/robot)
        "domainsigma",  // Mozilla/5.0 (compatible; DomainSigmaCrawler/0.1; +http://domainsigma.com/robot)
        "dotbot",       // Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)
        "easouspider",  // Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)
        "exabot",       // Mozilla/5.0 (compatible; Exabot/3.0; +http://www.exabot.com/go/robot)
        "fr-crawler",   // Mozilla/5.0 (compatible; fr-crawler/1.1)
        "genieo",       // Mozilla/5.0 (compatible; Genieo/1.0 http://www.genieo.com/webfilter.html)
        "golden-praga", // http://golden-praga.ru/;Opera/7.11 (Windows NT 5.1; U) [en]
        "httpclient",   // Apache-HttpClient/4.2.3 (java 1.5)
        "grapeshotcrawler", // Mozilla/5.0 (compatible; GrapeshotCrawler/2.0; +http://www.grapeshot.co.uk/crawler.php)
        "ia_archiver", // ia_archiver (+http://www.alexa.com/site/help/webmasters; crawler@alexa.com)
        "james bot",    // ;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6 - James BOT - WebCrawler http://cognitiveseo.com/bot.html
        "leikibot",     // Mozilla/5.0 (Windows NT 6.3;compatible; Leikibot/1.0; +http://www.leiki.com)
        "libcurl",      // curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
        "linkdexbot",   // Mozilla/5.0 (compatible; linkdexbot/2.0; +http://www.linkdex.com/bots/)
        "lipperhey",    // Mozilla/5.0 (compatible; Lipperhey SEO Service; http://www.lipperhey.com/)
        "livelap",      // "LivelapBot/0.2 (http://site.livelap.com/crawler)
        "lssrocket",    // LSSRocketCrawler/1.0 LightspeedSystems
        "magpie",       // magpie-crawler/1.1 (U; Linux amd64; en-GB; +http://www.brandwatch.net)
        "meanpathbot",  // Mozilla/5.0 (compatible; meanpathbot/1.0; +http://www.meanpath.com/meanpathbot.html)
        "memorybot",    // Mozilla/5.0 (compatible; memoryBot/1.20.311 +http://internetmemory.org/en/)
        "mj12bot",      // Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+)
        "nerdybot",     // NerdyBot
        "netseer",      // Mozilla/5.0 (compatible; NetSeer crawler/2.0; +http://www.netseer.com/crawler.html; crawler@netseer.com)
        "nutch",        // Kraken/Nutch-2.2.1 (Nutch crawler launched by Integral Ad Science, Inc.; TBD; TBD)
        "pleasebot",    // Mozilla/5.0 (compatible; 200PleaseBot/1.0; +http://www.200please.com/bot)
        "proximic",     // Mozilla/5.0 (compatible; proximic; +http://www.proximic.com/info/spider.php)
        "safesearch",   // SafeSearch microdata crawler (https://safesearch.avira.com, safesearch-abuse@avira.com)
        "semalt",       // http://semalt.semalt.com/crawler.php?
        "semrushbot",   // Mozilla/5.0 (compatible; SemrushBot/0.98~bl; +http://www.semrush.com/bot.html)
        "slurp",        // Yahoo! Slurp 
        "stackoverflow", // http://meta.stackoverflow.com/q/130398
        "riddler",      // Riddler (http://riddler.io/about)
        "ru_bot",       // Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; +http://go.mail.ru/help/robots)
        "SearchmetricsBot", // Mozilla/5.0 (compatible; SearchmetricsBot; http://www.searchmetrics.com/en/searchmetrics-bot/)
        "seokicks",     // Mozilla/5.0 (compatible; SEOkicks-Robot; +http://www.seokicks.de/robot.html)
        "seznambot",    // Mozilla/5.0 (compatible; SeznamBot/3.2; +http://fulltext.sblog.cz/)
        "showyoubot",   // ShowyouBot (http://showyou.com/crawler)
        "sistrix",      // Mozilla/5.0 (compatible; SISTRIX Crawler; http://crawler.sistrix.net/)
        "smtbot",       // Mozilla/5.0 (compatible; SMTBot/1.0; +http://www.similartech.com/smtbot)
        "spbot",        // Mozilla/5.0 (compatible; spbot/4.1.0; +http://OpenLinkProfiler.org/bot )
        "spiderbot",    // Spiderbot/Nutch-1.7
        "sogou",        // Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
        "tineye",       // moteur indexation images
        "turnitinbot",  // TurnitinBot/3.0 (http://www.turnitin.com/robot/crawlerinfo.html)
        "twitter",      // Twitterbot/1.0
        "twittmemebot", // Mozilla/5.0 (TweetmemeBot/4.0; +http://datasift.com/bot.html) Gecko/20100101 Firefox/31.0
        "umbot",        // Mozilla/5.0 (compatible; uMBot-LN/1.0; mailto: crawling@ubermetrics-technologies.com
        "voilabot",     // Mozilla/5.0 (Windows NT 5.1; U; Win64; fr; rv:1.8.1) VoilaBot BETA 1.2 (support.voilabot@orange-ftgroup.com)
        "wotbox",       // Wotbox/2.01 (+http://www.wotbox.com/bot/)
        "xovibot",      // Mozilla/5.0 (compatible; XoviBot/2.0; +http://www.xovibot.net/)
        "yandex",       // http://yandex.ru/images/search?
    );
 
    foreach ($unwanted AS $val) {
        if (stristr($_SERVER['HTTP_USER_AGENT'], $val) != FALSE) {
            header("HTTP/1.0 404 Not Found");
            readfile('404missing.html');
            die;
        }
    }
 
}

Ensuite, en tout début de votre fichier index.php, rajoutez cette ligne:

<?php
include 'unwantedBots.php';

Conclusion

Cette méthode est radicale. Elle bloque tous les robots qui sont dans le tableau $unwanted, à charge pour vous de le tenir à jour régulièrement en analysant vos fichiers de traçage.

Certains vont critiquer en avançant que ce traitement systématique sur l'analyse de la signature de user-agent consomme du temps de traitement. C'est partiellement vrai, mais c'est largement compensé par le fait que chaque robot rejeté arrêtera là ses investigations. Ce rejet fera économiser énormément de ressources d'hébergement.

Depuis la mise en place de cette méthode de filtrage des robots d'indexation indésirables, la bande passante sur certains serveurs que nous suivons a quasiment été divisée par deux!

Corrélativement, nous avons fait disparaitre l'erreur SQL "too many connections" qui indiquait qu'il y avait trop de transaction ssimultanées en base de données.

Tous les articles sur ce thème