Anti aspirateur: ne pas bloquer Google

ajax
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 292
Inscription: 20 Mar 2006

Anti aspirateur: ne pas bloquer Google

Message le Dim Juin 25, 2006 19:08

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: Tout sélectionner
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; }


rebirth
WRInaute impliqué
WRInaute impliqué
 
Messages: 909
Inscription: 18 Avr 2004

Message le Dim Juin 25, 2006 19:15

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

Zim'
WRInaute impliqué
WRInaute impliqué
 
Messages: 804
Inscription: 27 Avr 2006

Message le Dim Juin 25, 2006 19:16

rajouter ceci peut etre:

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


posté en retard, son code est mieux :) mais le miens fonctionne aussi

ajax
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 292
Inscription: 20 Mar 2006

Message le Dim Juin 25, 2006 19:30

Merci, je teste cela de suite.

Albert1
WRInaute impliqué
WRInaute impliqué
 
Messages: 935
Inscription: 23 Aoû 2005

Message le Dim Juin 25, 2006 19:44

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 ...

ajax
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 292
Inscription: 20 Mar 2006

Message le Dim Juin 25, 2006 20:12

Désolé, je n'ai pas de solution parfaite.

achaternet
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 256
Inscription: 11 Fév 2003

Message le Dim Juin 25, 2006 20:27

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 ;)

ajax
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 292
Inscription: 20 Mar 2006

Message le Dim Juin 25, 2006 20:41

le code serait le bienvenu

achaternet
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 256
Inscription: 11 Fév 2003

Message le Dim Juin 25, 2006 21:02



Ils se reconnaitront ;)
Dernière édition par achaternet le Dim Juin 25, 2006 21:31, édité 1 fois.

Albert1
WRInaute impliqué
WRInaute impliqué
 
Messages: 935
Inscription: 23 Aoû 2005

Message le Dim Juin 25, 2006 21:24

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 ...

achaternet
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 256
Inscription: 11 Fév 2003

Message le Dim Juin 25, 2006 21:33

Albert1 a écrit:tu prétends offrir un test ...


Oups :oops: , c etait en speed, on m attendait pour manger

ajax
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 292
Inscription: 20 Mar 2006

Message le Lun Juin 26, 2006 10:40

rebirth a écrit: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 (+http://www.google.com/bot.html)
car je bloque toujours cet useragent: HTTP_USER_AGENT => Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Merci

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

Code: Tout sélectionner
<?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);
}
?>

achaternet
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 256
Inscription: 11 Fév 2003

Message le Lun Juin 26, 2006 17:53

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 (+http://www.google.com/bot.html)
Mozilla/5.0 (compatible; Googlebot/2.1; http://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é ;)

ajax
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 292
Inscription: 20 Mar 2006

Message le Mar Juin 27, 2006 18:04

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; http://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 (+http://www.google.com/bot.html) ") { $rel = "1"; }

return($rel);

}

achaternet
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 256
Inscription: 11 Fév 2003

Message le Mar Juin 27, 2006 22:05

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; http://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 (+http://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

Anti aspirateur: ne pas bloquer Google

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité