Comment faire un anti-aspirateur de site en PHP
Vous en avez assez que l'on aspire votre site ?Ce "comment faire" est fait pour vous puisqu'il va vous permettre de limiter l'accès à votre site aux personnes utilisant un aspirateur de site.
Il faut savoir que les aspirateurs de sites, même si ils font le bonheur des utilisateurs de modem 56K sont une véritable plaie pour les webmestres de sites dynamiques ainsi que pour leur hébergeurs.
En effet ces fameux aspirateurs ont la fâcheuse tendance de partir facilement en boucle, et de pomper les ressources de la machine à n'en plus finir.
Pour un site un peu fréquenté, il est habituel de se retrouver avec plusieurs aspirateurs d'un coup.
Et la bande passante coûte chère.
Mieux vaut donc tout faire pour limiter ces petites bêtes ;)
Pour pouvoir contrer ce genre de petites bêtes, il faut tout d'abord comprendre comment fonctionne un aspirateur de sites.
D'une manière générale, un aspirateur de sites va charger une première page WEB, puis, de manière récursive, va aussi charger toutes les pages du site : cela fait comme si il cliquait sur tous les liens disponibles du site.
Pour contrer la chose, il faudrait donc que l'aspirateur arrive sur une page ; page qu'un utilisateur de type humain aurait très peu de chance de voir.
Le plus simple, serait donc de faire un lien vers une page PHP (lien qui serait présent sur toutes les pages de votre site), et ce lien serait matérialisé par une image transparente de 1 pixel sur 1 pixel.
Pourquoi ?
Tout simplement parce que l'humain aura très peu de chance de pointer cette image avec sa souris et que l'aspirateur (vu qu'il sniffe tous les liens) tombera forcément dedans.
Naturellement, il vaut mieux placer ce lien très "haut" dans votre site pour que l'aspirateur se fasse piéger des le début de son attaque.
Comment ?
Voici alors le code du lien permettant de piger les robots (code à placer dans toutes vos pages WEB) :
le_piege.php
<a href="suspect.php"><img src="blank.gif" width="1" height="1" border="0"></a>
<i>blank.gif étant une image transparente de 1 pixel sur 1 pixel.</i>
Dès lors, dans votre page suspect.php, vous allez tout faire pour bloquer l'accès au site pour la personne qui vient de s'y rendre.
Pour cela, vous avez plusieurs solutions :
- Relevez l'adresse IP de la personne, la stocker dans une table de votre base de données, et ensuite, de faire un test sur chaque page du site et de ne pas afficher le site (afficher en fait un petit message disant que les aspirateur de sites, ben c'est pas beau ^^) si l'adresse IP de la personne fait partie de votre table. Dans ce cas, pensez tout de même à vider votre table toutes les 4 heures : en effet, avec l'ADSL, les adresses IP s'échangent rapidement, et ça serait dommage de ne pas fournir l'accès au site à un utilisateur honnête qui aurait récupérer l'adresse IP d'un utilisateur d'aspirateur de sites.
- Initialiser une variable de session, comme par exemple isRobot à true, et ensuite, dans toutes les pages du site, de tester si cette variable existe, et le cas échéant, de ne pas afficher le site.
- Etc...
Voici un exemple de code pour la page suspect.php :
suspect.php
<?php
session_start();
// on enregistre une variable de session
$_SESSION['isRobot'] = true;
// une redirection vers le site
header('Location: index.php');
?>
Ensuite, il ne vous reste plus qu'à tester (sur toutes les pages de votre site, et ce, le plus haut possible, c'est-à-dire avant le code de votre site) si cette variable de session existe bien :
all.php
<?php
session_start();
if (isset($_SESSION['isRobot'])) {
echo 'C\'est pas beau les aspirateurs';
exit();
}
// le code du site
?>
Les moteurs de recherche ?
Naturellement, comme vous venez de le constater, lorsqu'un moteur de recherche va visiter notre site, il va forcément tomber sur notre page suspect.php et se faire piéger.
Afin d'éviter cela, nous allons faire quelques tests supplémentaires sur les visiteurs qui vont tomber sur la page suspect.php.
En effet, nous allons utiliser une fonction permettant de savoir, si l'utilisateur qui tombe sur notre page suspect.php est un vrai moteur de recherche ou non.
Le principe reste simple : on a une banque d'adresses IP représentant les principaux moteurs de recherche. Si l'adresse IP de la personne tombant sur notre page est dans cette banque (cela veut dire que l'on a affaire à un vrai robot) alors on permet l'affichage du site, sinon, et bien on fait comme auparavant : on bloque l'affichage du site.
Voici le code de cette fonction :
function.php
<?php
function isMoteur($ip) {
/* Liste des robots de : Google, Altavista, Inktomi, Voila, WiseNut, Fast, DeepIndex, Teoma, Whalhello, Gigablast, Mirago, picsearch, Szukacz, Openfind, Naver */
$listeiprobots[]='62.212.117.198';
$listeiprobots[]='62.119.21.157';
$listeiprobots[]='64.68.82.10';
$listeiprobots[]='64.68.82.14';
$listeiprobots[]='64.68.82.16';
$listeiprobots[]='64.68.82.17';
$listeiprobots[]='64.68.82.18';
$listeiprobots[]='64.68.82.25';
$listeiprobots[]='64.68.82.26';
$listeiprobots[]='64.68.82.27';
$listeiprobots[]='64.68.82.28';
$listeiprobots[]='64.68.82.30';
$listeiprobots[]='64.68.82.5';
$listeiprobots[]='64.68.82.6';
$listeiprobots[]='64.68.82.7';
$listeiprobots[]='64.68.82.31';
$listeiprobots[]='64.68.82.32';
$listeiprobots[]='64.68.82.33';
$listeiprobots[]='64.68.82.34';
$listeiprobots[]='64.68.82.35';
$listeiprobots[]='64.68.82.36';
$listeiprobots[]='64.68.82.37';
$listeiprobots[]='64.68.82.38';
$listeiprobots[]='64.68.82.39';
$listeiprobots[]='64.68.82.41';
$listeiprobots[]='64.68.82.43';
$listeiprobots[]='64.68.82.44';
$listeiprobots[]='64.68.82.45';
$listeiprobots[]='64.68.82.46';
$listeiprobots[]='64.68.82.47';
$listeiprobots[]='64.68.82.48';
$listeiprobots[]='64.68.82.50';
$listeiprobots[]='64.68.82.51';
$listeiprobots[]='64.68.82.52';
$listeiprobots[]='64.68.82.54';
$listeiprobots[]='64.68.82.55';
$listeiprobots[]='64.68.82.56';
$listeiprobots[]='64.68.82.57';
$listeiprobots[]='64.68.82.58';
$listeiprobots[]='64.68.82.65';
$listeiprobots[]='64.68.82.66';
$listeiprobots[]='64.68.82.67';
$listeiprobots[]='64.68.82.68';
$listeiprobots[]='64.68.82.69';
$listeiprobots[]='64.68.82.70';
$listeiprobots[]='64.68.82.71';
$listeiprobots[]='64.68.82.74';
$listeiprobots[]='64.68.82.77';
$listeiprobots[]='64.68.82.78';
$listeiprobots[]='64.68.82.79';
$listeiprobots[]='64.241.243.65';
$listeiprobots[]='64.241.243.65';
$listeiprobots[]='64.241.242.177';
$listeiprobots[]='65.214.36.150';
$listeiprobots[]='65.214.36.152';
$listeiprobots[]='65.214.38.10';
$listeiprobots[]='66.77.73.203';
$listeiprobots[]='66.77.73.61';
$listeiprobots[]='66.237.60.22';
$listeiprobots[]='66.196.72.10';
$listeiprobots[]='66.196.72.11';
$listeiprobots[]='66.196.72.12';
$listeiprobots[]='66.196.72.13';
$listeiprobots[]='66.196.72.14';
$listeiprobots[]='66.196.72.15';
$listeiprobots[]='66.196.72.16';
$listeiprobots[]='66.196.72.17';
$listeiprobots[]='66.196.72.18';
$listeiprobots[]='66.196.72.19';
$listeiprobots[]='66.196.72.20';
$listeiprobots[]='66.196.72.21';
$listeiprobots[]='66.196.72.22';
$listeiprobots[]='66.196.72.23';
$listeiprobots[]='66.196.72.24';
$listeiprobots[]='66.196.72.25';
$listeiprobots[]='66.196.72.26';
$listeiprobots[]='66.196.72.27';
$listeiprobots[]='66.196.72.28';
$listeiprobots[]='66.196.72.29';
$listeiprobots[]='66.196.72.30';
$listeiprobots[]='66.196.72.31';
$listeiprobots[]='66.196.72.32';
$listeiprobots[]='66.196.72.33';
$listeiprobots[]='66.196.72.34';
$listeiprobots[]='66.196.72.35';
$listeiprobots[]='66.196.72.36';
$listeiprobots[]='66.196.72.37';
$listeiprobots[]='66.196.72.38';
$listeiprobots[]='66.196.72.39';
$listeiprobots[]='66.196.72.40';
$listeiprobots[]='66.196.72.41';
$listeiprobots[]='66.196.72.42';
$listeiprobots[]='66.196.72.43';
$listeiprobots[]='66.196.72.44';
$listeiprobots[]='66.196.72.45';
$listeiprobots[]='66.196.72.46';
$listeiprobots[]='66.196.72.47';
$listeiprobots[]='66.196.72.48';
$listeiprobots[]='66.196.72.49';
$listeiprobots[]='66.196.72.50';
$listeiprobots[]='66.196.72.51';
$listeiprobots[]='66.196.72.52';
$listeiprobots[]='66.196.72.53';
$listeiprobots[]='66.196.72.54';
$listeiprobots[]='66.196.72.55';
$listeiprobots[]='66.196.72.56';
$listeiprobots[]='66.196.72.57';
$listeiprobots[]='66.196.72.58';
$listeiprobots[]='66.196.72.59';
$listeiprobots[]='66.196.72.60';
$listeiprobots[]='66.196.72.61';
$listeiprobots[]='66.196.72.62';
$listeiprobots[]='66.196.72.63';
$listeiprobots[]='66.196.72.64';
$listeiprobots[]='66.196.72.65';
$listeiprobots[]='66.196.72.66';
$listeiprobots[]='66.196.72.67';
$listeiprobots[]='66.196.72.68';
$listeiprobots[]='66.196.72.69';
$listeiprobots[]='66.196.72.70';
$listeiprobots[]='66.196.72.71';
$listeiprobots[]='66.196.72.72';
$listeiprobots[]='66.196.72.73';
$listeiprobots[]='66.196.72.74';
$listeiprobots[]='66.196.72.75';
$listeiprobots[]='66.196.72.76';
$listeiprobots[]='66.196.72.77';
$listeiprobots[]='66.196.72.78';
$listeiprobots[]='66.196.72.79';
$listeiprobots[]='66.196.72.80';
$listeiprobots[]='66.196.72.81';
$listeiprobots[]='66.196.72.82';
$listeiprobots[]='66.196.72.83';
$listeiprobots[]='66.196.72.84';
$listeiprobots[]='66.196.72.85';
$listeiprobots[]='66.196.72.86';
$listeiprobots[]='66.196.72.87';
$listeiprobots[]='66.196.72.88';
$listeiprobots[]='66.196.72.89';
$listeiprobots[]='66.196.72.90';
$listeiprobots[]='66.196.72.91';
$listeiprobots[]='66.196.72.92';
$listeiprobots[]='66.196.72.93';
$listeiprobots[]='66.196.72.94';
$listeiprobots[]='66.196.72.95';
$listeiprobots[]='66.196.72.96';
$listeiprobots[]='66.196.72.97';
$listeiprobots[]='66.196.72.98';
$listeiprobots[]='66.196.72.99';
$listeiprobots[]='66.196.72.100';
$listeiprobots[]='66.196.72.101';
$listeiprobots[]='66.196.72.102';
$listeiprobots[]='66.196.72.103';
$listeiprobots[]='66.196.72.104';
$listeiprobots[]='66.196.72.105';
$listeiprobots[]='66.196.72.106';
$listeiprobots[]='66.196.72.107';
$listeiprobots[]='66.196.72.108';
$listeiprobots[]='66.196.72.109';
$listeiprobots[]='193.218.115.6';
$listeiprobots[]='195.101.94.208';
$listeiprobots[]='195.101.94.101';
$listeiprobots[]='195.101.94.209';
$listeiprobots[]='209.249.67.128';
$listeiprobots[]='209.249.67.139';
$listeiprobots[]='209.73.164.50';
$listeiprobots[]='210.59.144.149';
$listeiprobots[]='212.127.141.180';
$listeiprobots[]='213.73.184.72';
$listeiprobots[]='213.73.184.96';
$listeiprobots[]='216.243.113.1';
$listeiprobots[]='216.39.48.82';
$listeiprobots[]='216.39.48.164';
$listeiprobots[]='216.39.50.160';
$listeiprobots[]='216.39.50.116';
$listeiprobots[]='216.39.50.143';
$listeiprobots[]='216.39.50.144';
$listeiprobots[]='216.39.50.145';
$listeiprobots[]='216.39.50.155';
$listeiprobots[]='216.39.48.58';
$listeiprobots[]='216.239.46.19';
$listeiprobots[]='216.239.46.23';
$listeiprobots[]='216.239.46.3';
$listeiprobots[]='216.239.46.30';
$listeiprobots[]='216.239.46.36';
$listeiprobots[]='216.239.46.41';
$listeiprobots[]='216.239.46.42';
$listeiprobots[]='216.239.46.43';
$listeiprobots[]='216.239.46.60';
$listeiprobots[]='216.239.46.102';
$listeiprobots[]='216.239.46.104';
$listeiprobots[]='216.239.46.105';
$listeiprobots[]='216.239.46.86';
$listeiprobots[]='216.239.46.96';
$listeiprobots[]='216.239.46.98';
$listeiprobots[]='216.239.46.99';
$listeiprobots[]='216.239.46.118';
$listeiprobots[]='216.239.46.140';
$listeiprobots[]='216.239.46.147';
$listeiprobots[]='216.239.46.165';
$listeiprobots[]='216.239.46.184';
$listeiprobots[]='217.205.60.225';
$listeiprobots[]='218.145.25.110';
$listeiprobots[]='218.145.25.49';
$listeiprobots[]='216.88.158.142';
$listeiprobots[]='127.0.0.1';
if(in_array($ip, $listeiprobots)) {
return true;
}
else{
return false;
}
}
?>
On aura alors le code suivant pour notre page suspect.php :
suspect.php
<?php
session_start();
// on enregistre une variable de session
$_SESSION['isRobot'] = true;
function get_ip() {
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
// on inclus notre fonction isMoteur contenu dans le fichier dataBot.php
include ('dataBot.php');
// on récupère l'adresse IP du visiteur
$ip = get_ip();
// on teste si on a affaire à un vrai moteur de recherche
if(!isMoteur($ip)) {
$_SESSION['isAspi'] = true;
}
// une redirection vers le site
header('Location: index.php');
?>
Evidemment, on peut encore penser que notre fonction isMoteur ne peut pas identifier tous les moteurs de recherche du monde.
Pour ce faire, je vous propose de vous envoyer un mail des qu'un aspirateur se fait coincer sur la page suspect.php.
Ce mail, contenant l'adresse IP du suspect, libre à vous ensuite de faire vos verifications (c'est-à-dire de voir si il s'agit d'un vrai moteur de recherche ou bien d'un aspirateur de site) et de mettre à jour en conséquence, le liste des adresses IP des moteurs de recherche.
Voici alors la portion de code que vous placerez sur toutes les pages de votre site :
all.php
<?php
session_start();
function get_ip() {
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
if (isset($_SESSION['isRobot'])) {
if (isset($_SESSION['isAspi'])) {
// on s'envoie un mail contenant l'adresse IP du visiteur (il s'agit peut être d'un vrai moteur de recherche)
$ip = get_ip();
$domaine = @gethostbyaddr($ip) or ($domaine = 'IP non résolue');
$contenu = '<html><head><title>Aspirateur</title></head><body>'.
'Un aspirateur a été choppé sur mon site<br /><br />'.
'Son IP : '.$ip.'<br />'.
'Domaine : '.$domaine.''.
'</body></html>';
mail("mail@site.com", "Un aspirateur sur mon site.", $contenu, "From: mail@site.com\r\nReply-To: mail@site.com\r\nContent-Type: text/html; charset=\"iso-8859-1\"\r\n");
// on bloque l'affichage
echo 'C\'est pas beau les aspirateurs';
exit();
}
}
// le code du site
?>
Libre à vous, ensuite, de bloquer cette adresse IP, ou bien de l'inclure dans votre banque d'adresses IP de moteurs de recherche.