TraceIP : anti aspirateur de site web en PHP-MySQL

Télécharger TraceIP v4

Présentation de Trace-IP v4

Trace-IP v4 côté client
Inscriptions
  • IP stockée un temps par défaut et supprimée si trop "vieille"
  • IP bannie si trop de requêtes.
  • Un seul fichier PHP à inclure dans les pages du site
Trace-IP v4 côté admin
Configuration
  • Configuration générale
  • Configuration du nombre maxi de pages par minutes
  • Visualisation et gestion des IP bannies ou non sur le site.
  • Listes blanche et noire pour ignorer des IP ou forcer le bannissement
  • Nouveautés V4 : compatibilité PHP5, PHP7

Intérêts de ce script

Ce script est un script réalisé sur la base de l'anti aspirateur de RenardRouge (Lien : Stop aspirateurs) réalisé en 2003 - merci à lui de m'avoir permis cette publication. Le script initial présente plusieurs évolutions possibles, proposées par l'auteur, qui sont ici réalisées. Il présente en outre une optimisation du code source.

Qu'est-ce qu'un aspirateur de site Web ?

Un aspirateur de site Web ne sert pas, comme son nom porte à le croire, à faire les poussières. Il s'agit d'un logiciel qui va visiter un site Web et enregistrer toutes les pages sur le disque dur du visiteur pour une consultation hors ligne ultérieure.

ATTENTION : il n'y a aucun moyen, dans l'absolu, d'empêcher le visiteur d'enregistrer vos pages sur son disque dur ! Ce script va très fortement freiner les gens, en rendant impossible l'enregistrement en masse, mais ne pourra pas les empêcher d'aller visiter votre site puis faire "Fichier" > "Enregistrer la page sous ...".
  • Avantages :
    • Pour l'utilisateur final, tout le site web est sur son disque dur, il peut y avoir accès quand il veut, même sans Internet (pratique pour les connexions bas débit, pour les ordinateurs portables quand il n'y a pas de réseau sans fil par exemple) ;
    • Le téléchargement du site Web est fait exactement tel qu'un navigateur Internet le ferait (Internet Explorer, Firefox, Opera ...).
  • Inconvénients :
    • Pour l'utilisateur, si des mises à jour sont disponibles sur le site, il faut tout retélécharger, il n'est pas averti en temps réel ;
    • Pour le serveur, l'aspirateur demande un grand nombre de requêtes dans un laps de temps très court (Voir définition : requêtes HTTP / hits) donc une surcharge ponctuelle du serveur, et une consommation ponctuelle de la bande passante souvent inutile ;
    • Pour les autres clients sur le serveur (cas d'un serveur mutualisé - voir définition : hébergement mutualisé -) cela peut générer un pic d'indisponibilité ou de lenteur ;
    • Pour le webmaster, trop de requêtes consommées peut aussi signifier un surcoût au niveau de l'hébergeur ;
    • Pour le webmaster, un site aspiré est un visiteur qui est venu une fois, et qui ne reviendra potentiellement pas (si le site a peu de nouveautés quotidiennes) ;
    • Aspirer un site revient à le voir tel qu'il est à un moment donné, toutes les parties dynamiques du site (forum, moteur de recherche ...) ne seront pas disponibles.

Pour ces raisons, le webmaster soucieux de son site peut être amené à mettre en oeuvre un tel système... Mais comment procéder, concrètement ?

Reconnaissance des aspirateurs : 3 écoles

Concernant la reconnaissance d'un aspirateur, il y a 3 façons que l'on peut mettre en lumière :

  • Le HTTP_USER_AGENT
  • Une page piège
  • L'automatisme

Méthode 1 : HTTP_USER_AGENT

Nous allons expliciter chacune des 3 méthodes, avec avantages et inconvénients. La première méthode est celle du HTTP_USER_AGENT, c'est une variable que le serveur peut récupérer depuis le client (i.e. le visiteur ... Vous, au final !) Ce "user agent" est une variable dont la valeur est un texte qui identifie votre navigateur, par exemple Microsoft Internet Explorer 4.0. C'est "l'agent utilisateur", donc l'identité de votre outil de navigation tel qu'il est vu par le serveur. Partant de ce principe, on peut dresser une liste de tous les "user agents" et dès que le serveur en détecte un qui ne ressemble pas à un navigateur connu, on l'écarte : le serveur le redirige sur une page par défaut.

Cette technique se met en place par la copie de ces lignes dans un fichier nommé .htaccess situé à la racine du serveur Web (ici on redirige l'aspirateur vers Google.com, mais cela peut être n'importe quelle autre adresse) :

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^FlashGet.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*HTTrack.*$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*MemoWeb.*$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*FileHound.*$
RewriteRule /* http://www.google.com/ [R,L]

En pratique, cette technique est très fastidieuse à mettre en place pour 3 raisons :

  1. Le premier souci de ce genre de long script est sa difficulté de maintenance, en effet, il faut relire une longue liste pour voir si la ligne contenant le nom du "user agent" existe déjà ou pas, pour en mettre à jour s'il le faut ... ;
  2. Le second souci est sur l'identification du robot, en effet certains (comme HTTrack) s'identifient clairement, mais la plupart ne le font pas et/ou ne tiennent pas compte du fichier robots.txt et passeront au travers des mailles du filet. Ceci dit, cela bloquera les "gros" aspirateurs ;
  3. Le troisième souci est que la liste se base sur le "user agent", c'est à dire en quelque sorte le nom du navigateur client. Or si celui-ci est la plupart du temps disponible (comme je l'ai dit pour HTTrack) il peut aussi facilement être modifié, voire annihilé : Norton Internet Security par exemple ou les outils Steganos empêchent l'envoi de ce type d'information, et le site avec un visiteur sous Steganos Internet Anonym par exemple se laissera aspirer facilement et docilement.

Comme quoi, tout parait simple ... Mais en réalité, cette technique ne laisse pas le contrôle total.

Voici une autre liste que j'ai trouvée d'aspirateurs non vérifiés :

RewriteCond %{HTTP_USER_AGENT} ^-?$ [OR]
RewriteCond %{HTTP_USER_AGENT} Advanced\ Email\ Extractor [OR]
RewriteCond %{HTTP_USER_AGENT} almaden [NC,OR]
RewriteCond %{HTTP_USER_AGENT} @nonymouse [OR]
RewriteCond %{HTTP_USER_AGENT} Art-Online [OR]
RewriteCond %{HTTP_USER_AGENT} CherryPicker [OR]
RewriteCond %{HTTP_USER_AGENT} Crescent\ Internet\ ToolPack [OR]
RewriteCond %{HTTP_USER_AGENT} DirectUpdate [OR]
RewriteCond %{HTTP_USER_AGENT} Download\ Accelerator [OR]
RewriteCond %{HTTP_USER_AGENT} eCatch [OR]
RewriteCond %{HTTP_USER_AGENT} echo\ extense [OR]
RewriteCond %{HTTP_USER_AGENT} EmailCollector [OR]
RewriteCond %{HTTP_USER_AGENT} EmailWolf [OR]
RewriteCond %{HTTP_USER_AGENT} ExtractorPro [OR]
RewriteCond %{HTTP_USER_AGENT} Fetch\ API\ Request [OR]
RewriteCond %{HTTP_USER_AGENT} FlashGet [NC,OR]
RewriteCond %{HTTP_USER_AGENT} frontpage [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Go!Zilla [OR]
RewriteCond %{HTTP_USER_AGENT} HTTP\ agent [OR]
RewriteCond %{HTTP_USER_AGENT} HTTPConnect [OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [OR]
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [OR]
RewriteCond %{HTTP_USER_AGENT} IPiumBot\ laurion(dot)com [OR]
RewriteCond %{HTTP_USER_AGENT} Kapere [OR]
RewriteCond %{HTTP_USER_AGENT} libwww-perl [OR]
RewriteCond %{HTTP_USER_AGENT} Microsoft\ URL\ Control [OR]
RewriteCond %{HTTP_USER_AGENT} minibot\(NaverRobot\) [OR]
RewriteCond %{HTTP_USER_AGENT} NICErsPRO [OR]
RewriteCond %{HTTP_USER_AGENT} NPBot [OR]
RewriteCond %{HTTP_USER_AGENT} Offline\ Explorer [OR]
RewriteCond %{HTTP_USER_AGENT} Offline\ Navigator [OR]
RewriteCond %{HTTP_USER_AGENT} Program\ Shareware [OR]
RewriteCond %{HTTP_USER_AGENT} QuepasaCreep [OR]
RewriteCond %{HTTP_USER_AGENT} SiteMapper [OR]
RewriteCond %{HTTP_USER_AGENT} Star\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} SurveyBot [OR]
RewriteCond %{HTTP_USER_AGENT} Teleport\ Pro [OR]
RewriteCond %{HTTP_USER_AGENT} Telesoft [OR]
RewriteCond %{HTTP_USER_AGENT} TuringOS [OR]
RewriteCond %{HTTP_USER_AGENT} TurnitinBot [OR]
RewriteCond %{HTTP_USER_AGENT} vobsub [NC,OR]
RewriteCond %{HTTP_USER_AGENT} webbandit [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WebCapture [OR]
RewriteCond %{HTTP_USER_AGENT} webcollage [OR]
RewriteCond %{HTTP_USER_AGENT} WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} WebDAV [OR]
RewriteCond %{HTTP_USER_AGENT} WebEmailExtractor [OR]
RewriteCond %{HTTP_USER_AGENT} WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} WEBsaver [OR]
RewriteCond %{HTTP_USER_AGENT} WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} Wget [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Wysigot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Zeus.*Webster [OR]
RewriteCond %{HTTP_USER_AGENT} Zeus [OR]
RewriteCond %{HTTP_REFERER} ^XXX

RewriteCond %{HTTP_USER_AGENT} ADSARobot [OR]
RewriteCond %{HTTP_USER_AGENT} ah-ha [NC,OR]
RewriteCond %{HTTP_USER_AGENT} aktuelles [NC,OR]
RewriteCond %{HTTP_USER_AGENT} amzn_assoc [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Anarchie [OR]
RewriteCond %{HTTP_USER_AGENT} ASPSeek [OR]
RewriteCond %{HTTP_USER_AGENT} ASSORT [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ATHENS [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Atomz [OR]
RewriteCond %{HTTP_USER_AGENT} attach [NC,OR]
RewriteCond %{HTTP_USER_AGENT} attache [NC,OR]
RewriteCond %{HTTP_USER_AGENT} autoemailspider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} BackWeb [OR]
RewriteCond %{HTTP_USER_AGENT} Bandit [OR]
RewriteCond %{HTTP_USER_AGENT} BatchFTP [OR]
RewriteCond %{HTTP_USER_AGENT} bdfetch [NC,OR]
RewriteCond %{HTTP_USER_AGENT} big.brother [NC,OR]
RewriteCond %{HTTP_USER_AGENT} BlackWidow [OR]
RewriteCond %{HTTP_USER_AGENT} bmclient [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Boston\ Project [OR]
RewriteCond %{HTTP_USER_AGENT} BravoBrian\ SpiderEngine\ MarcoPolo [OR]
RewriteCond %{HTTP_USER_AGENT} Buddy [OR]
RewriteCond %{HTTP_USER_AGENT} Bullseye [NC,OR]
RewriteCond %{HTTP_USER_AGENT} bumblebee [NC,OR]
RewriteCond %{HTTP_USER_AGENT} capture [OR]
RewriteCond %{HTTP_USER_AGENT} ChinaClaw [OR]
RewriteCond %{HTTP_USER_AGENT} CICC [OR]
RewriteCond %{HTTP_USER_AGENT} clipping [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Crescent [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Crescent\ Internet\ ToolPak [OR]
RewriteCond %{HTTP_USER_AGENT} Custo [OR]
RewriteCond %{HTTP_USER_AGENT} cyberalert [OR]
RewriteCond %{HTTP_USER_AGENT} Deweb [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Diagem [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Digger [OR]
RewriteCond %{HTTP_USER_AGENT} Digimarc [OR]
RewriteCond %{HTTP_USER_AGENT} DIIbot [OR]
RewriteCond %{HTTP_USER_AGENT} disco [NC,OR]
RewriteCond %{HTTP_USER_AGENT} DISCoFinder [OR]
RewriteCond %{HTTP_USER_AGENT} Download\ Demon [OR]
RewriteCond %{HTTP_USER_AGENT} Download\ Wonder [OR]
RewriteCond %{HTTP_USER_AGENT} Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} Drip [OR]
RewriteCond %{HTTP_USER_AGENT} DSurf15a [OR]
RewriteCond %{HTTP_USER_AGENT} DTS.Agent [NC,OR]
RewriteCond %{HTTP_USER_AGENT} EasyDL [OR]
RewriteCond %{HTTP_USER_AGENT} ecollector [NC,OR]
RewriteCond %{HTTP_USER_AGENT} efp@gmx\.net [OR]
RewriteCond %{HTTP_USER_AGENT} Email\ Extractor [OR]
RewriteCond %{HTTP_USER_AGENT} EirGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} Express\ WebPictures [OR]
RewriteCond %{HTTP_USER_AGENT} EyeNetIE [OR]
RewriteCond %{HTTP_USER_AGENT} fastlwspider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} FavOrg [OR]
RewriteCond %{HTTP_USER_AGENT} Favorites\ Sweeper [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Fetch [NC,OR]
RewriteCond %{HTTP_USER_AGENT} FEZhead [NC,OR]
RewriteCond %{HTTP_USER_AGENT} FileHound [OR]
RewriteCond %{HTTP_USER_AGENT} FlashGet\ WebWasher [OR]
RewriteCond %{HTTP_USER_AGENT} FlickBot [OR]
RewriteCond %{HTTP_USER_AGENT} fluffy [NC,OR]
RewriteCond %{HTTP_USER_AGENT} GalaxyBot [OR]
RewriteCond %{HTTP_USER_AGENT} Generic [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Getleft [NC,OR]
RewriteCond %{HTTP_USER_AGENT} GetRight [OR]
RewriteCond %{HTTP_USER_AGENT} GetSmart [OR]
RewriteCond %{HTTP_USER_AGENT} GetWeb! [OR]
RewriteCond %{HTTP_USER_AGENT} GetWebPage [NC,OR]
RewriteCond %{HTTP_USER_AGENT} gigabaz [OR]
RewriteCond %{HTTP_USER_AGENT} Girafabot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} go-ahead-got-it [NC,OR]
RewriteCond %{HTTP_USER_AGENT} GornKer [OR]
RewriteCond %{HTTP_USER_AGENT} Grabber [NC,OR]
RewriteCond %{HTTP_USER_AGENT} GrabNet [OR]
RewriteCond %{HTTP_USER_AGENT} Grafula [OR]
RewriteCond %{HTTP_USER_AGENT} Green\ Research [OR]
RewriteCond %{HTTP_USER_AGENT} Harvest [NC,OR]
RewriteCond %{HTTP_USER_AGENT} hhjhj@yahoo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} hloader [OR]
RewriteCond %{HTTP_USER_AGENT} HMView [OR]
RewriteCond %{HTTP_USER_AGENT} HomePageSearch [OR]
RewriteCond %{HTTP_USER_AGENT} httpdown [OR]
RewriteCond %{HTTP_USER_AGENT} http\ generic [OR]
RewriteCond %{HTTP_USER_AGENT} IBM_Planetwide [OR]
RewriteCond %{HTTP_USER_AGENT} Image\ Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} Image\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} imagefetch [OR]
RewriteCond %{HTTP_USER_AGENT} IncyWincy [NC,OR]
RewriteCond %{HTTP_USER_AGENT} informant [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Ingelin [NC,OR]
RewriteCond %{HTTP_USER_AGENT} InterGET [OR]
RewriteCond %{HTTP_USER_AGENT} Internet\ Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} InternetLinkAgent [OR]
RewriteCond %{HTTP_USER_AGENT} InternetSeer\.com [OR]
RewriteCond %{HTTP_USER_AGENT} Iria [OR]
RewriteCond %{HTTP_USER_AGENT} Irvine [OR]
RewriteCond %{HTTP_USER_AGENT} JBH*Agent [OR]
RewriteCond %{HTTP_USER_AGENT} JetCar [OR]
RewriteCond %{HTTP_USER_AGENT} JOC [OR]
RewriteCond %{HTTP_USER_AGENT} JOC\ Web\ Spider [OR]
RewriteCond %{HTTP_USER_AGENT} JustView [OR]
RewriteCond %{HTTP_USER_AGENT} KWebGet [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Lachesis [OR]
RewriteCond %{HTTP_USER_AGENT} larbin [NC,OR]
RewriteCond %{HTTP_USER_AGENT} LeechFTP [OR]
RewriteCond %{HTTP_USER_AGENT} LexiBot [OR]
RewriteCond %{HTTP_USER_AGENT} lftp [OR]
RewriteCond %{HTTP_USER_AGENT} libwww [OR]
RewriteCond %{HTTP_USER_AGENT} likse [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Link*Sleuth [OR]
RewriteCond %{HTTP_USER_AGENT} LINKS\ ARoMATIZED [OR]
RewriteCond %{HTTP_USER_AGENT} LinkWalker [OR]
RewriteCond %{HTTP_USER_AGENT} LWP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} lwp-trivial [OR]
RewriteCond %{HTTP_USER_AGENT} Magnet [OR]
RewriteCond %{HTTP_USER_AGENT} Mac\ Finder [OR]
RewriteCond %{HTTP_USER_AGENT} Mag-Net [OR]
RewriteCond %{HTTP_USER_AGENT} Mass\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} MCspider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} MIDown\ tool [OR]
RewriteCond %{HTTP_USER_AGENT} Mirror [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Missigua\ Locator [OR]
RewriteCond %{HTTP_USER_AGENT} Mister\ PiX [NC,OR]
RewriteCond %{HTTP_USER_AGENT} MMMtoCrawl\/UrlDispatcherLLL [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla$ [OR]
RewriteCond %{HTTP_USER_AGENT} MSProxy [OR]
RewriteCond %{HTTP_USER_AGENT} multithreaddb [NC,OR]
RewriteCond %{HTTP_USER_AGENT} nationaldirectory [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Navroad [OR]
RewriteCond %{HTTP_USER_AGENT} NearSite [OR]
RewriteCond %{HTTP_USER_AGENT} Net\ Vampire [OR]
RewriteCond %{HTTP_USER_AGENT} NetAnts [OR]
RewriteCond %{HTTP_USER_AGENT} NetCarta [NC,OR]
RewriteCond %{HTTP_USER_AGENT} NetMechanic [OR]
RewriteCond %{HTTP_USER_AGENT} netprospector [NC,OR]
RewriteCond %{HTTP_USER_AGENT} NetResearchServer [NC,OR]
RewriteCond %{HTTP_USER_AGENT} NetSpider [OR]
RewriteCond %{HTTP_USER_AGENT} NetZIP [OR]
RewriteCond %{HTTP_USER_AGENT} NetZip\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} NetZippy [OR]
RewriteCond %{HTTP_USER_AGENT} NEWT [NC,OR]
RewriteCond %{HTTP_USER_AGENT} nicerspro [NC,OR]
RewriteCond %{HTTP_USER_AGENT} NPBot [OR]
RewriteCond %{HTTP_USER_AGENT} Octopus [OR]
RewriteCond %{HTTP_USER_AGENT} OpaL [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Openfind [OR]
RewriteCond %{HTTP_USER_AGENT} OpenTextSiteCrawler [NC,OR]
RewriteCond %{HTTP_USER_AGENT} OrangeBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} PackRat [NC,OR]
RewriteCond %{HTTP_USER_AGENT} PageGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} Papa\ Foto [OR]
RewriteCond %{HTTP_USER_AGENT} pavuk [NC,OR]
RewriteCond %{HTTP_USER_AGENT} PersonaPilot [OR]
RewriteCond %{HTTP_USER_AGENT} pcBrowser [OR]
RewriteCond %{HTTP_USER_AGENT} PingALink [OR]
RewriteCond %{HTTP_USER_AGENT} Pockey [OR]
RewriteCond %{HTTP_USER_AGENT} Proxy [OR]
RewriteCond %{HTTP_USER_AGENT} psbot [OR]
RewriteCond %{HTTP_USER_AGENT} PSurf [NC,OR]
RewriteCond %{HTTP_USER_AGENT} puf [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Pump [OR]
RewriteCond %{HTTP_USER_AGENT} PushSite [NC,OR]
RewriteCond %{HTTP_USER_AGENT} QRVA [OR]
RewriteCond %{HTTP_USER_AGENT} RealDownload [OR]
RewriteCond %{HTTP_USER_AGENT} Reaper [OR]
RewriteCond %{HTTP_USER_AGENT} Recorder [OR]
RewriteCond %{HTTP_USER_AGENT} ReGet [OR]
RewriteCond %{HTTP_USER_AGENT} replacer [NC,OR]
RewriteCond %{HTTP_USER_AGENT} RepoMonkey [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Robozilla [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Rover [NC,OR]
RewriteCond %{HTTP_USER_AGENT} RPT-HTTPClient [OR]
RewriteCond %{HTTP_USER_AGENT} Rsync [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SearchExpress [OR]
RewriteCond %{HTTP_USER_AGENT} searchhippo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} searchterms\.it [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Second\ Street\ Research [OR]
RewriteCond %{HTTP_USER_AGENT} Seeker [OR]
RewriteCond %{HTTP_USER_AGENT} Shai [NC,OR]
RewriteCond %{HTTP_USER_AGENT} sitecheck [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SiteSnagger [OR]
RewriteCond %{HTTP_USER_AGENT} SlySearch [OR]
RewriteCond %{HTTP_USER_AGENT} SmartDownload [OR]
RewriteCond %{HTTP_USER_AGENT} snagger [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SpaceBison [OR]
RewriteCond %{HTTP_USER_AGENT} Spegla [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SpiderBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SqWorm [OR]
RewriteCond %{HTTP_USER_AGENT} Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} SuperBot [OR]
RewriteCond %{HTTP_USER_AGENT} SuperHTTP [OR]
RewriteCond %{HTTP_USER_AGENT} Surfbot [OR]
RewriteCond %{HTTP_USER_AGENT} SurfWalker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Szukacz [OR]
RewriteCond %{HTTP_USER_AGENT} tAkeOut [OR]
RewriteCond %{HTTP_USER_AGENT} tarspider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Templeton [NC,OR]
RewriteCond %{HTTP_USER_AGENT} TrueRobot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} TV33_Mercator [OR]
RewriteCond %{HTTP_USER_AGENT} UIowaCrawler [NC,OR]
RewriteCond %{HTTP_USER_AGENT} URL_Spider_Pro [OR]
RewriteCond %{HTTP_USER_AGENT} UtilMind [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Vacuum [OR]
RewriteCond %{HTTP_USER_AGENT} vagabondo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} vayala [NC,OR]
RewriteCond %{HTTP_USER_AGENT} visibilitygap [NC,OR]
RewriteCond %{HTTP_USER_AGENT} VoidEYE [OR]
RewriteCond %{HTTP_USER_AGENT} vspider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} w3mir [NC,OR]
RewriteCond %{HTTP_USER_AGENT} web\.by\.mail [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Web\ Data\ Extractor [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Web\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} Web\ Image\ Collector [OR]
RewriteCond %{HTTP_USER_AGENT} Web\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} WebAuto [OR]
RewriteCond %{HTTP_USER_AGENT} Webclipping [OR]
RewriteCond %{HTTP_USER_AGENT} webcollector [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} webcraft@bea [NC,OR]
RewriteCond %{HTTP_USER_AGENT} webdevil [NC,OR]
RewriteCond %{HTTP_USER_AGENT} webdownloader [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Webdup [OR]
RewriteCond %{HTTP_USER_AGENT} WebFetch [OR]
RewriteCond %{HTTP_USER_AGENT} WebGo\ IS [OR]
RewriteCond %{HTTP_USER_AGENT} WebHook [OR]
RewriteCond %{HTTP_USER_AGENT} Webinator [OR]
RewriteCond %{HTTP_USER_AGENT} WebLeacher [OR]
RewriteCond %{HTTP_USER_AGENT} WEBMASTERS [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WebMiner [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WebMirror [OR]
RewriteCond %{HTTP_USER_AGENT} webmole [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} WebSauger [OR]
RewriteCond %{HTTP_USER_AGENT} Website\ eXtractor [OR]
RewriteCond %{HTTP_USER_AGENT} Website\ Quester [OR]
RewriteCond %{HTTP_USER_AGENT} WebSnake [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Webster [OR]
RewriteCond %{HTTP_USER_AGENT} WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} websucker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} webvac [NC,OR]
RewriteCond %{HTTP_USER_AGENT} webwalk [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} webweasel [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} Wget [OR]
RewriteCond %{HTTP_USER_AGENT} whizbang [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WhosTalking [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Widow [OR]
RewriteCond %{HTTP_USER_AGENT} WISEbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WUMPUS [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Wweb [OR]
RewriteCond %{HTTP_USER_AGENT} WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} XGET [NC,OR]
RewriteCond %{HTTP_USER_AGENT} x-Tractor [OR]
RewriteCond %{HTTP_USER_AGENT} Yandex [OR]
RewriteRule ^.*$ http://www.google.fr [R,L]

Plus complète, on ne peut cependant pas garantir qu'elle stoppera tous les aspirateurs.

Méthode 2 : page piégée

La plupart des aspirateurs (et même des robots d'indexation, tels que Googlebot, MSNBot, etc.) suivent des directives dans un fichier nommé "robots.txt" situé à la racine du site. Ce fichier absent, c'est la balise <meta name="robots" content="all"> qu'ils recherchent pour savoir quoi faire : indexer la page, suivre les liens ... Mais le problème réside dans le deuxième mot de ce paragraphe : "plupart" ne signifie pas "tous". D'autre part, le fichier robots.txt ainsi que la balise Meta citée sont facultatifs, donc en cas d'absence des 2 éléments conjointement, il faut savoir prendre une décision ...

Le principe de la page piégée est simple : créer une page liée à l'accueil du site par exemple, qui sera intermédiaire, et dans cette page, mettre la balise :

	<meta name="robots" content="none"> <!-- Doctype HTML -->
	<meta name="robots" content="none" /> <!-- Doctype XHTML -->

Le robots lisant cette page ne doit donc suivre aucun lien. Et dans cette page (non suivie), un lien vers la fameuse page piégée qui contient de quoi enregistrer l'IP du robot pour le bannir ... Mais cette technique est assez complexe à mettre en oeuvre (ça fait 2 pages pour pas grand chose au final) et ça n'apporte rien de plus, puisque le robot peut être "gentil" et ne pas tenir compte de la balise Meta de la page intermédiaire... Auquel cas il sera banni pour rien. C'est le jeu, ma pauvre Lucette...

Méthode 3 : l'automatisme, principe de Trace-IP et Trace-IP v4

Finalement, un aspirateur de site va généralement fonctionner ainsi :

  • Il envoie une première requête sur la page indiquée par l'utilisateur et enregistre la page (ainsi que ses images, CSS, javascripts, ...)
  • Il trouve tous les liens que la page contient
  • Il effectue une requête pour chaque lien trouvé
  • Il recommence avec les liens qu'il a trouvés sur les nouvelles pages et qui ne sont pas reprises dans la liste des liens déjà récoltés.

Evidemment, les requêtes envoyées se succèdent à un rythme effrené (plusieurs par secondes)...

Le principe de base serait donc de vérifier si les requêtes émises par une IP donnée ne se succèderaient pas à un rythme trop rapide pour qu'un utilisateur "normal" ait pu profiter de la page...

PHP nous fournit une fonction sympa comme tout : time() qui nous renvoie le nombre de secondes écoulées depuis le début de l'ère Unix (le 1er janvier 1970... mais cela n'a que peu d'importance).
Il "pourrait suffire" de mettre sur toutes les pages un script qui :

  • Indique dans une table l'IP du visiteur et la valeur renvoyée par time() (dans le cas où l'IP n'est pas connue ou que la valeur indiquée par time() est supérieure à celle contenue dans la table, mettons de soixante secondes) ainsi que le nombre de requêtes effectuées à cette heure là
  • Incrémente le nombre de requêtes effectuées s'il y en a plusieurs effectuées par la même IP sur la même seconde
  • Renvoie vers une page unique ("aspiration interdite") si un certain nombre de requêtes a été effectuée trop rapidement (si plus de 5 requête/seconde, par exemple)

Evidemment, la table devra être vidée régulièrement, surtout sur les sites à gros trafic (mais, là aussi, on peut prévoir dans le script le fait de virer d'office tous les enregistrements plus vieux que, par exemple, 1 minute (time()-60)

TraceIP exécute ce principe : dès qu'un visiteur arrive sur le site, son IP est récupérée. Si elle est présente dans la base de données, alors on incrémente son compteur de pages de 1. Sinon, on l'y inscrit. Lorsque le compteur dépasse une limite par défaut, l'IP est marquée comme "bloquée" et le script TraceIP renvoie un message d'erreur au navigateur. Bien entendu, à chaque visite du site, toutes les IP ayant un compteur inférieur à la limite et non bloquées, ainsi que vieilles depuis plus de 60 secondes sont effacées.

Nouveauté de la V3 : support natif de listes blanche et noire

Merci à François du forum pour la suggestion.

Si vous voulez autoriser une adresse IP (ou plusieurs) à vie, renseignez-la en liste blanche. Elle ne sera plus incommodée par les limitations de Trace IP.

Si vous voulez forcer le bannissement d'une ou plusieurs IP, la liste noire vous conviendra à merveille ...

Nouveauté de la V4 : support PHP5, PHP7

Le script a été mis à jour pour utiliser l'extension PDO/MySQL, il est également compatible PHP7.

Vous avez besoin d'aide pour installer TraceIP v4 ? le forum est là pour ça !