Voila, si j'écris ce post si pour signaler une possible faille de sécurité dans les anti aspirateurs de site, faille qui aurai pour conséquence de vous faire bannir volontairement un bot d'un moteur de recherche et de vous faire couler au fond du classement.
le problème
Le bannissement d'un moteur de recherche par un anti aspirateur de site peut être involontaire (mauvais paramétrage d'un script par exemple) ou volontaire. En effet, un concurrent malhonnête pourrait volontairement vous envoyer des requêtes http avec pour ip source celle d'un moteur de recherche (c'est tout à fait possible, il existe des générateurs de paquets http qui font çà), ce qui aurait pour conséquence de bannir automatiquement le bot de votre site, ce qui ferait autant de pages indexés en moins. Quant à dire que c'est peu probable, vu la concurrence qu'il y a dans le milieu du référencement, je préfère prévenir que guérir .
la solution
Heureusement, il existe une solution simple. Elle consiste à définir une liste d'ips de confiance, incluant les ips des bots de recherche. Si l'ip de l'hote fait partie de la liste, on ne le banni pas sinon on le banni et on envoie un mail à l'administrateur.
Remarque : pour ceux qui se dirait que les aspirateurs de site pourraient intégré une technologie qui falsifierai l'ip et la mettrai dans la liste des ips de confiance, dites vous bien que quand un logiciel fait une requête avec une ip qui n'est pas la sienne, la réponse est directement envoyé à l'ip falsifié ce qui n'a aucun n'intêrets pour le leecher.
Implémentation
L'implémentation se fait en plusieurs temps, d'abord on fait un fichier antiaspi.php (source plus bas) qu'on upload sur le serveur. Ensuite, on fait un rewriting sur ce fichier de ce type.
Ce régle renvoie tous les fichiers de la forme [chiffre]anti.html vers antiaspi.php, par exemple 75864anti.html ou 6anti.html.
Ensuite, on "parsème le site web",de liens aléatoires ayant la forme définie précédemment et non visible par l'utilisateur. (il vaut mieux éviter les liens vides car les aspirateurs les détectent et ne les suivent pas)
fichier antiaspi.php
Remarque
Surveillez bien les ips envoyés dans les même de bannissement des fois qu'il manque des ips de bots (et posté les ici tant qu'on y est, je pense que j'en ai oublié pour msnbot)
Le problème est d'autant plus vicieux qu'on ne peux pas identifier le concurrent (dans le cas ou il spoofe son ip).
le problème
Le bannissement d'un moteur de recherche par un anti aspirateur de site peut être involontaire (mauvais paramétrage d'un script par exemple) ou volontaire. En effet, un concurrent malhonnête pourrait volontairement vous envoyer des requêtes http avec pour ip source celle d'un moteur de recherche (c'est tout à fait possible, il existe des générateurs de paquets http qui font çà), ce qui aurait pour conséquence de bannir automatiquement le bot de votre site, ce qui ferait autant de pages indexés en moins. Quant à dire que c'est peu probable, vu la concurrence qu'il y a dans le milieu du référencement, je préfère prévenir que guérir .
la solution
Heureusement, il existe une solution simple. Elle consiste à définir une liste d'ips de confiance, incluant les ips des bots de recherche. Si l'ip de l'hote fait partie de la liste, on ne le banni pas sinon on le banni et on envoie un mail à l'administrateur.
Code:
Si (ip_appartient_a_liste_de_confiance())
redirection_vers_l_index_du_site
sinon
bannissement_par_htaccess
mail_a_l_administrateur
affichage_d_un_message
finSi
Remarque : pour ceux qui se dirait que les aspirateurs de site pourraient intégré une technologie qui falsifierai l'ip et la mettrai dans la liste des ips de confiance, dites vous bien que quand un logiciel fait une requête avec une ip qui n'est pas la sienne, la réponse est directement envoyé à l'ip falsifié ce qui n'a aucun n'intêrets pour le leecher.
Implémentation
L'implémentation se fait en plusieurs temps, d'abord on fait un fichier antiaspi.php (source plus bas) qu'on upload sur le serveur. Ensuite, on fait un rewriting sur ce fichier de ce type.
RewriteRule ^([0-9]+)anti\.html$ antiaspi.php [L,NC,NS]
Ce régle renvoie tous les fichiers de la forme [chiffre]anti.html vers antiaspi.php, par exemple 75864anti.html ou 6anti.html.
Ensuite, on "parsème le site web",de liens aléatoires ayant la forme définie précédemment et non visible par l'utilisateur. (il vaut mieux éviter les liens vides car les aspirateurs les détectent et ne les suivent pas)
fichier antiaspi.php
Code:
<?
// phplicense
// auteur : mumuri
// site : http://topflood.com
// pour une ip en 216.239.33.xxx, mettre 216.239.33. , attention à ne pas oublier le . final
// pour 216.239.xxx.xxx mettre 216.239.
// http://www.iplists.com/google.txt
// http://www.iplists.com/inktomi.txt
$ip = $_SERVER["REMOTE_ADDR"]; // récupére l'ip
// Remarque : pour faire des tests, vous pouvez forcer l'ip
// $ip = "66.249.239.23"; // bot
// $ip = "23.66.249.239"; // ip standard
$ipsautorisees= array(
'216.239.','66.249.','209.185.','64.68.','64.233.','216.33.', // google bot
'141.185.','169.207.','199.177.','202.160.','202.165.','202.212.5.','202.46.19.93','203.123.188.', '203.255.234.', // yahoo
'206.190.43.','207.126.239.','209.1.12.','209.1.13.','209.131.','209.191.','209.185.', '209.1.32.','209.191.',
'209.67.206.','209.73.176.', '211.14.8.240','211.169.241.21','213.216.143.','216.109.','216.136.233.164','216.145.58.219',
'216.155.', '216.198.200.123' ,'216.239.193.','216.32.237.','62.172.199.','62.27.59.245','63.163.102.182', '64.157.137.',
'64.157.138.','64.75.36.','66.163.170.' ,'66.163.174.65','66.196.101','66.196.65' ,'66.196.67.','66.196.','66.218.65.52',
'66.228.', '66.94.','68.142.', '72.30.101.','72.30.102.', '72.30.103.','72.30.104.','72.30.107.','72.30.110.','72.30.111.',
'72.30.128.', '72.30.129.','72.30.131.','72.30.132.','72.30.133.','72.30.134','72.30.135.','72.30.',
'207.46.98.', '65.54.188.' ,'207.68.146.' // msn bot
);
if(is_in_liste($ip) )
{
// ip de confiance
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://votresite.com");
exit;
} else
{
// banissement
// -------- bannir ici : script de Baltyre ------------
$htaccess="\nDeny from ".$ip;
$fp = fopen(".htaccess","a");
if (flock($fp, LOCK_EX)) {
fputs($fp,$htaccess);
flock($fp, LOCK_UN);
}
fclose($fp);
// ---------------------------------------------
// --------------- mailer -------------------
$Host = gethostbyaddr( $ip ); // Retourne le Host
$Referer = getenv("HTTP_REFERER"); // Retourne le Referer
$Date = date("F j, Y, g:i:s"); // Date du jour
$Client = getenv("HTTP_USER_AGENT");
$site = getenv("HTTP_HOST"); // récupére le nom du site , si vous en avez plusieurs
$message = "<b>Banissement d'une ip</b> \n";
$message .= "------------------- \n";
$message .= " Site : $site \n\n";
$message .= "<b> Infos sur le banni :</b> \n";
$message .= " Ip : $ip \n";
$message .= " Host : $Host \n";
$message .= " Client : $Client \n";
$message .= " Date : $Date \n";
$message .= " Référant : $Referer \n";
// envoie d'un mail au responsable : utile si par hasard un robot est passé à travers votre filtre
mail ("votreemail@votredomaine.com", "Alerte Ban: $ip - ".$Date, $message , "From: banissement@$site");
// ---------------------------------------------
// --------------- affichage -------------------
// on averti le banni ...
echo "<html><head><title>Bannissement</title></head><body><pre>";
echo "<h1>Banissement</h1>\n";
echo "L'utilisation d'aspirateur de site est proscrite sur ce site . Vous avez donc été banni\n";
// on lui fait un peu peur ;)
echo "Les informations suivantes ont été loggué et pourront faire l'objet d'une poursuite judiciaire.\n\n";
echo $message;
echo "\n\n";
// le truc à la con ... ;)
echo "Apprenez que pour flooder un site, il y a des techniques :<a href=http://topflood.free.fr/zine/base-Techniques-de-flood.php>techniques de flood</a>\n";
// dés fois que y'en qui s'amuse à afficher la source de certains sites et qu'il teste l'url
echo "Si vous pensez que c'est une erreur, veuillez en avertir le webmaster à blabla@site.com \n";
echo "</pre><a href=ban.php>ss</a></body></html>";
// ---------------------------------------------
}
function is_in_liste($ip)
{ global $ipsautorisees;
$trouve= false;
$taille = count($ipsautorisees);
$i=0;
while($i<$taille && !$trouve )
{
$pos = strpos ($ip,$ipsautorisees[$i]);
if($pos === 0 )
{
$trouve= true;
}
$i++;
}
return $trouve;
}
?>
Remarque
Surveillez bien les ips envoyés dans les même de bannissement des fois qu'il manque des ips de bots (et posté les ici tant qu'on y est, je pense que j'en ai oublié pour msnbot)
Le problème est d'autant plus vicieux qu'on ne peux pas identifier le concurrent (dans le cas ou il spoofe son ip).