Tutorial: Stopper les robots spammeurs qui crawl votre site

Tutorial: Stopper les robots spammeurs qui crawl votre site

Jusqu’à présent je n’avais pas trop parlé technique. Aspect de ce blog que je souhaite développer à présent.

Aujourd’hui je vais vous montrer une technique que je trouve très efficace et très utile: Empêcher les robots spammeurs de vous prendre votre bande passante et de vous faire ralentir votre site et accessoirement de polluer vos commentaires (je dis accessoirement car il existe par exemple les captcha qui vous permettent d’y remédier). Le concept est très simple et m’a particulièrement séduit.

Si vous ne savez pas ce qu’est un robot d’indexation, plus communément appelé “web crawler”, je vous invite à lire la définition sur wikipédia.

Les basics:

  1. Les robots suivent les liens
  2. Les “bons” robots obéissent au robot.txt
  3. Un “mauvais robot” va suivre un lien qui a été banni par le robot.txt

Vous voyez ou je veux en venir ???

Voila la stratégie à mettre en place:

  1. Attraper le robot et
  2. l’empêcher d’accéder au site.

Oui mais comment faire ?

Etape 1: Crée un lien caché

Créer un lien caché vers une page du type monsite.com/avoid.php. Pour une meilleure efficacité inséré ce lien sur toutes les pages de votre site. Je recommande de cacher ce lien en css, car il sera compris facilement par les robots: Exemple:

<a href=”/avoid.php” style=”display:none;”>je vous ai eu</a>

Etape 2: Editer votre robot.txt

Pour ceux qui ne savent pas ce qu’est un robot.txt, faite un tour ici. Nous allons à présent interdire aux robots l’accès à cette page:

User-agent: * Disallow: /avoid.php

Etape 3: Enregistrez l’IP du robot qui accède à votre page

Notre piège est presque prêt. Sur la page avoid.php nous voulons sauvegarder les informations du robot qui accède à cette page.

voila le schéma de notre base de données:

CREATE TABLE `bad_robot` ( `ip` varchar(50) NOT NULL default ”, `useragent` varchar(200) default NULL, `date_ajout` datetime default NULL, `isDisallow` tinyint(4) NOT NULL default ‘0’, PRIMARY KEY (`ip`) )

L’IP du robot est la clé primaire de notre base. Je sauvegarde également le useragent qui me permettra d’avoir un peu plus d’informations sur le robot. La date d’ajout me permet d’avoir un historique et optionnellement un champs “isDisallow” qui m’indique si oui ou non on va interdire le robot. Ce dernier champs n’est pas obligatoire mais vivement conseillé. En effet il est préférable de faire une petite page d’administration qui vous permettra d’autoriser ou non l’accès au site. Il arrive que certains “bon” robot analyse quand même la page ou qu’un internaute y accède (cela voudrait dire qu’il est allé triffouiller dans le code :( pas bien). Libre à vous de faire comme moi.

Une fois la table crée il faut écrire le code (PHP en ce qui me concerne) qui va enregistrer ce robot dans la base. J’utilise la bibliothèque pear, très utiles pour vos développements PHP (mais cela n’est bien sur pas obligatoire).

< ?php require_once(”DB.php”); $db = DB::connect(”mysql://user:pass@localhost/database”); if (PEAR::isError($db)) die(”Could not connect to database”); $db->query(”insert into badrobots set ip=?, useragent=?, datetime=!”, array($_SERVER[’REMOTE_ADDR’], $_SERVER[’HTTP_USER_AGENT’], “now()”)); echo “Vous vous êtes fait avoir !!!! ”; ?>

Etape 4: Bannir les robots

La dernière étape va permettre d’empêcher les robots, qui ont été enregistré, à accéder au site. On peut l’interdire de différente manières:

  1. Interdire le robot en php
  2. Interdire le robot avec le mod_access de l’htaccess (Allow from.. Deny from..)
  3. Interdire le robot avec des règles de firewall

Je ne vais que parler de l’option 1 dans ce tutorial. L’option 2 vous oblige à éditer les règles manuellement. Et l’option 3 demande des configurations un peu plus poussés. Bien que l’option 1 soit moins performante (accès à la base) elle est toutefois très efficace et très simple à mettre en place.

< ?php // Connection à la db if ($db->getOne(”select count(1) from badrobots where ip=? and isDisallow = 1”, Array($_SERVER[’REMOTE_ADDR’]))) die(“Vous ne pouvez pas accèder à ce site, merci de contacter l’administrateur”); ?>

Voila votre piège est pret à fonctionner. Tout commentaire est bon à prendre. J’attends vos feedbacks et vos suggestions …

8 COMMENTAIRES

  1. Et pour les robots qui changent carrément de structure d’IP? on va pas les virer. Car si un humain(gentil) se voit attribuer cette ip quelques temps après il sera dégagé.
    Ya t-il un palliatif?

    • Je ne pense pas qu’un humain peut se voir réattribuer une IP qui était à la base affecté à un robot.

      Et on parle bien des robots spammeurs et non des robots types google, bing, … qui respectent le fichier robots.txt

  2. En faisant ça on risque pas de perdre en efficacité côté référencement ? Car google utilise aussi le robot.txt pour parser le site et être mieux indexé non ? Du coup google ne risque t-il pas d’être bloqué ?

    • il n’a aucun impact d’un point de vue du référencement naturel.

      En effet, nous précisons uniquement aux robots de ne pas aller crawler la page “/avoid.php” via l’instruction User-agent: * Disallow: /avoid.php

      Par conséquent, Google, Bing et autres vont continuer à crawler et indéxer vos pages sans problèmes.

  3. Bonjour Jo,
    Cette méthode est-elle toujours d’actualité ? Si c’est le cas, je vais essayer de suivre ça pas à pas, sans faire de bêtise !
    J’ai à nouveau un robot qui me fait des misères avec plusieurs milliers de pages crawlées chaque jour et j’ai des sites référents tendancieux…
    J’imagine que ces crawls de pages ne sont pas très bons pour mon référencement si on considère le temps moyen passé sur le site.
    Le côté positif, c’est que mon système anti spam est performant !

Répondre à Anonyme Annuler le commentaire