Anti aspirateur: ne pas bloquer Google

WRInaute discret
Bonjour
J'ai trouvé sur wri ce bout de code qui de manière classique compte les IP et les bloque si les connexions sont trop nombreuse, mais qui normalement permet à Google d'éviter d'être bloqué.

Ici on peut voir que Googlebot/2.1 n'est pas bloqué, mais je ne sais pas comment modifier légèrement cette ligne pour y ajouter Mediapartners-Google/2.1.

---------------------------

Code:
function googlebot($agent) {

ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

$nomnav = strtoupper($tab[1]);

if ($nomnav == "Googlebot/2.1") { $rel = "1"; }

return($rel);

}

$refe = googlebot($HTTP_USER_AGENT);

if ($refe == "1") { $Max = 500; } else { $Max = 35; }
 
WRInaute impliqué
rajouter ceci peut etre:

if ($nomnav == "Mediapartners-Google/2.1") { $rel = "1"; }


posté en retard, son code est mieux :) mais le miens fonctionne aussi
 
WRInaute impliqué
et comme ça si notre ami qui utilise Httrack spoofe son User Agent il peut commettre ses méfaits en toutes tranquillité !

essaie donc Httrack, tu verras avec quelle facilité tu peux lui attribuer l'User Agent de ton choix ...
 
WRInaute discret
J ai enfin trouvé la solution ultime, radicale, efficace, et qui ne bloque pas les bots et bloque n importe quel aspirateur!

Divers scripts testés, mais toujours des inconveniants.
Mais surtout, si l aspi ouvre de nombreux pages simultanées, le script est OUT, et il continue le pompage du reste du site :(

J ai créé moi meme un script qui bloque les bloques, et ca fonctionne du tonnerre.

Script en place depuis plus d un an sur un de mes sites et nickel.

Le projet encore en beta:

http://www.anti-aspirateur.com/

Concretement, je souhaite proteger une partie de mon code, mais vous faire profiter les webmaster de cette protection.

Pour l instant, cela ne fonctionne pas encore parfaitement pour vous autres, mais bientot operationnelle.

:arrow: Sinon, je defis qui souhaite tenter d aspirer 30 pages rapidements, par exemple, depuis http://www.anti-aspirateur.com/test_aspi.php

faite vous passer pour qui vous voulez... :lol:

Je vous tiendrez au courant, la communauté wri de la finalisation de ce projet ;)
 
WRInaute impliqué
tu prétends offrir un test et ensuite
tu affiches des adresses IP personnelles complètes et en clair (voir CNIL) sur la place publique !

tu es un bien étrange spécimen ...
 
WRInaute discret
rebirth a dit:
if ($nomnav == "Googlebot/2.1" || $nomnav == "CeQueTuVeuxMettre") { $rel = "1"; }

Je me permets de relancer. J'ai l'impression qu'il y a une erreur dans la condition car elle ne semble pas être prise en compte.
En gros, ce que je souhaite, c'est une valeur OU.

Je me demande aussi si à la place de Googlebot/2.1, il ne faut pas préciser: Googlebot/2.1 (+https://www.google.com/bot.html)
car je bloque toujours cet useragent: HTTP_USER_AGENT => Mozilla/5.0 (compatible; Googlebot/2.1; +https://www.google.com/bot.html)
Merci

Je mets tout le script (pris dans ce forum) si cela peut intéresser

Code:
<?php

$to = xxx

$from = "xxx@xxx.com";

$dbhost = "localhost";
$dbuname = "xxx";
$dbpass = "xxx";
$dbname = "xxx";

function googlebot($agent) {

ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

$nomnav = strtoupper($tab[1]);

if ($nomnav == "Googlebot/2.1" || $nomnav == "Mediapartners-Google/2.1") { $rel = "1"; }

return($rel);

}

$refe = googlebot($HTTP_USER_AGENT);

if ($refe == "1") { $Max = 200; } else { $Max = 25; }


$Vcpt  = 0;
$Vdate = date("Y/m/d H:i");
$Vua   = $HTTP_SERVER_VARS["HTTP_USER_AGENT"];
$Vip   = $HTTP_SERVER_VARS["REMOTE_ADDR"];

$Realtime = time();
$Limitime = $Realtime + 1200;

$dbic = mysql_connect($dbhost,$dbuname,$dbpass);
mysql_select_db($dbname);

if ($dbic <> 0)
{
   // clean up old IP
   mysql_query("DELETE FROM ip WHERE date <> '$Vdate'");
   mysql_query("DELETE FROM ip_bl WHERE ltime < '$Realtime'");

   // chercher si le visiteur est interdit
   $res = mysql_query("SELECT ip FROM ip_bl WHERE ip='$Vip' AND ltime > '$Realtime' ");
   while(list($ip) = mysql_fetch_row($res))
   {
      // Visiteur trouvé dans les IP interdites
           mysql_free_result($res);      
           mysql_close($dbic);
		   die("Vous consultez trop rapidement les pages du site. Votre adresse IP est bloquée durant 20mn.");

header("HTTP/1.0 404 Not Found");

exit;
   
}
   mysql_free_result($res);

   // chercher si le visiteur est déjà passé
   $res = mysql_query("SELECT id, ip, date, cpt FROM ip WHERE ip='$Vip'");
   while(list($id, $ip, $date, $cpt) = mysql_fetch_row($res)) $Vcpt = $cpt;
   mysql_free_result($res);

   if ($Vcpt == 0) mysql_query("INSERT into ip (id, ua, ip, date, cpt) values ('', '$Vua', '$Vip', '$Vdate', '1')");
   else
   {
      // Visiteur ayant déjà chargé des pages dans la même minute ==> +1 sur le compteur
      mysql_query("UPDATE ip SET cpt=cpt+1 WHERE ip='$Vip'");
   
      // si limite atteinte (25 pages php/min) ajouter dans la table des ip interdites.
      if ($Vcpt >= $Max )
      {
         mysql_query("INSERT into ip_bl (id, ua, ip, date, cpt, ltime) values ('', '$Vua', '$Vip', '$Vdate', '$Vcpt', '$Limitime')");

         $msg = "HTTP_SERVER_VARS:\n" ;
    			while (list ($key, $val) = each ($HTTP_SERVER_VARS)) $msg .= "$key => $val\n";
    			$msg = addslashes($msg);
    			eval("\$msg = "$msg";");
    			$msg = stripslashes($msg);
    			mail ("xxx@xxx.com", "[IP Interdite] $Vip - $Vdate", $msg, "From: banmaster@votre_domaine.tdl");
      }
   }

$VVcpt = round(((round (($Vcpt / ($Max + 1)) * 100)) / 100) * 100);

$Acpt = $Vcpt + 1;

   mysql_close($dbic);
}
?>
 
WRInaute discret
Je ne suis pas un expert en expression reguliere, mais je vais essayer de te faire avancer

Les 3 agents de google:

Googlebot/2.1 (+https://www.google.com/bot.html)
Mozilla/5.0 (compatible; Googlebot/2.1; https://www.google.com/bot.html)
Mediapartners-Google/2.1


$nomnav == "Googlebot/2.1" || $nomnav == "Mediapartners-Google/2.1")

L expression reguliere:

ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

teste la presence de Googlebot/2.1

Du coup, le tableau qui en ressort ne donne pas le meme resultat du positionnement de gg2.1 et ainsi LE TEST EST DIFFERENT.

$nomnav = strtoupper($tab[1]);

Oui, mais selon le cas. Des fois, ca peut etre $tab[0] .

Essaie de tester non pas avec $tab[1], mais $tab[0] ,$tab[1] et $tab[2] au cas ou.

a l arrache là, genre:

$nomnav = strtoupper($tab[0]);
if ($nomnav == "Googlebot/2.1") { $rel = "1"; }
$nomnav = strtoupper($tab[1]);
if ($nomnav == "Googlebot/2.1") { $rel = "1"; }
$nomnav = strtoupper($tab[2]);
if ($nomnav == "Googlebot/2.1") { $rel = "1"; }


J espere t avoir fait progressé ;)
 
WRInaute discret
Merci

Autrement dit:

function googlebot($agent) {

ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

$nomnav = strtoupper($tab[0]);
if ($nomnav == "Mozilla/5.0 (compatible; Googlebot/2.1; https://www.google.com/bot.html)") { $rel = "1"; }
$nomnav = strtoupper($tab[1]);
if ($nomnav == "Mediapartners-Google/2.1") { $rel = "1"; }
$nomnav = strtoupper($tab[2]);
if ($nomnav == "Googlebot/2.1 (+https://www.google.com/bot.html) ") { $rel = "1"; }

return($rel);

}
 
WRInaute discret
Non, je ne pense pas:

ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

Pour traduire:

On repere tout ce qui commence par:

- des lettres minuscules ou majuscule suivi
- d'1 slash suivi d'1 ou plusieurs chiffres suivi
- d 1 point suivi d'1 ou plusieurs chiffres et enfin suivi
- du reste ( pour simplifier)


Ainsi l expression "Googlebot/2.1" correspond a cela et c est ce que l on cherche.

Enfin, avec la fonction ereg, il distingue l expression cherchée du reste.

Regarde en detail http://fr.php.net/manual/fr/function.ereg.php

Apres d en deduira sur quel indice de ta table tester.

Sinon, toujours pas, pas grave, il suffit de te faire une page test

... et de tester

Plus precisement:

$agent="juste que c est pas google";
ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

// Boucle foreach pour afficher tab[] et l indice correspondant.

$agent="Mozilla/5.0 (compatible; Googlebot/2.1; https://www.google.com/bot.html)";
ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

// Boucle foreach pour afficher tab[] et l indice correspondant.


$agent="Mediapartners-Google/2.1";
ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

// Boucle foreach pour afficher tab[] et l indice correspondant.

$agent="Googlebot/2.1 (+https://www.google.com/bot.html) ";
ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $agent, $tab);

// Boucle foreach pour afficher tab[] et l indice correspondant.



De la, direct, en fonction des agents et des indices resultant, tu saura quoi tester.

Ps: Pour foreach http://fr.php.net/manual/fr/control-str ... oreach.php
 
WRInaute passionné
C'est un peux prés çà ^^
Plus sérieusement, tous le monde à donné sont petit bout de code, et sa devient farfelue, donc si on pourvait éclaircire ma petite lanterne
 
WRInaute accro
+1

recommander.gif
 
WRInaute impliqué
salva a dit:
Très bonne url pour contrer les aspirateurs de site.
bonne url pour les incompétents et/ou pour ceux qui ont des sites hébergés sur des serveurs du "Tiers Monde Informatique".
à part çà, je ne vois pas.
 
WRInaute accro
En tous cas, tu es le champion du site qui pèse le moins: 1ko (si, si 1000 octets).
Je m’incline devant une telle performance. :D
 
WRInaute impliqué
c'est pas le mien ;) je m'en suis expliqué à plusieurs reprises
comme par exemple dans ce topic :
-https://www.webrankinfo.com/forum/viewtopic_57291.htm#550497
 
Nouveau WRInaute
Salut moi je propose de ne pas trop bidouiller le script initial juste en rajoute :

mysql_query("UPDATE ip SET cpt=cpt-1 WHERE ua='LE USER AGENT A NE PAS BLOQUER'");

de sorte a ne pas comptabilisé le nombre de pages visiter par le user agent souhaiter

Qu'en pensez vous ? 8O
 
Discussions similaires
Haut