Que pensez-vous de cette détection des bots ?

WRInaute accro
Bonjour

Le problème de la détection des bots, a maintes fois été évoqué sur ce forum, cependant j'ai essayé de voir d'après des mots-clés dans les messages passés, et je n'ai pas trouvé de moyen de détecter les bots.

Je sais, que de nombreuses adresses ip de bots n'ont pas de reverse. Evidemment, il faudrait disposer d'une table de ces adresses ip, mais je n'ai pas celà pour l'instant. ;)

J'ai programmé cette petite fonction ci-dessous is_bot($ip_address) en php , qui me détecte effectiveemnt des bots.

Sur mon site, quand un bot est déctecté de cette manière, son adresse ip filtrée ( passée à la moulinette de la focntion filtered_address($ip_address) ) , est insérée dans une tabkle MySQL des bots BOT_ADDRESS, ne contenant qu'un seul champ

TABLE BOT_ADDRESS(IP_ADDRESS VARCHAR(100) NOT NULL PRIMARY KEY DEFAULT '');

Evidemment, vu le primary key, l'insert n'a lieu qu'une fois pour la même adresse ip filtrée.

Donc, celà me sert simplement, à éliminer de ma table MySQL CONNEXION les adresses ip filtrées, datant de plus de 20 secondes, qui existent aussi dans la table BOT_ADDRESS.

Celà peut se faire en une seule instruction MySQL.

L'appel à la fonction is_bot() , n'est fait qu'à chaque fois qu'un nouvau vsiiteur se présente sur mon site.

Un nouveau visiteur est une visite qui ne s'est pas terminée précédemment, dans un délai de 5 minutes maximum depuis le dernier chargement de page de la dernière visite éventuelle.

A mon avis, le seul délai en cause, est l'appel dans cette fonction is_bot(), à la fonction gethostbyaddr() , qui nécessite une requête à un servur DNS, puis le retour de l'information.

Je ne fais pas du tout de cloaking, le comportement de mon site est strictement le même, pour une visite de bot, ou autre chose.

Et même, si le bot interprète le Javascript, mon site se comporte de la même façon que pour n'importe quel visiteur qui accepte le Javascript.

Simplement, je suis désireux, d'une part de détecter si Javascritp est activé ou non, et/ou les Cooies acceptés ou non, ceci de manière automatique.

Si l'un des deux ( ou les deux ), ne sont pas actifs, un message s'affiche, suggérant de permettre Javascript et les Cookies.

D'autre part, le procédé que j'utilise, me permet de garder trace des visites de mes visiteurs, sur une période passée de 1 mois 1/2 ( 45 jours ), ce qui me permettra, à terme, de faire des statistiques de trafic.

Merci beaucoup, de me donner vos avis et suggestions, par rapport à la fiabilité de cette fonction is_bot() ;)

Par exemple, l'array list_bots() , auait probablement besoin d'être complété. ;)

Bien amicalement.

Jean Françosi Ortolo


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

/*
* Danc cette fonction, les constantes
* IP4_POINT_NUMBER et
* IP6_POINT_NUMBER,
* valent respectvement, :
* 1, et 2.
*/
function filtered_address($ip_address)
{
if(!empty($ip_address))
{
//
// 4 nombres,
// séparés par
// un point.
if(preg_match("{^([0-9]+)(\.[0-9]+){3}$}", $ip_address))
$last_point_number = IP4_POINT_NUMBER;
else
$last_point_number = IP6_POINT_NUMBER;

$tmp_array_ip_addr = array();

if(preg_match("{\.}", $ip_address))
$tmp_array_ip_addr = preg_split("{\.}", $ip_address);
else
$tmp_array_ip_addr[0] = $ip_address;

$tmp_count = count($tmp_array_ip_addr);

$fix_ip_addr = $tmp_array_ip_addr[0];

for($i = 1; $i < ($tmp_count - $last_point_number); $i++)
$fix_ip_addr .= "." . $tmp_array_ip_addr[$i];
}
else
{
$fix_ip_addr = false;
}

return($fix_ip_addr);
}

function is_bot($ip_address)
{
$list_bots = array("#bing#", "#babylon#", "#search#", "#aol#", "#voila#", "#incredimail#", "#ia[_-]?archiver#", "#ask#", "#teoma#", "#spider#", "#exabot#", "#thumbnails#", "#gamespy#", "#gigabot#", "#google#", "#grub#", "#inktomi#", "#slurp#", "#msnbot#", "#scooter#", "#altavista#", "#w3c[_-]?validator#", "#yahoo#", "#yandex#");

$n = count($list_bots);

/*
* C'est l'adresse ip filtrée
* de ma propre connexion
* Internet, car il semble
* que quelqu'un
* ait choisi comme reverse,
* un nom de bot.
*/
$permitted_bots = array('82.225.74');

if(empty($ip_address))
return(false);

$fix_address = filtered_address($ip_address);

$url = gethostbyaddr($ip_address);

if(in_array($fix_address, $permitted_bots))
return(false);

if($url !== false)
{
if($url != $ip_address)
{
$url = strtolower($url);

for($i = 0; $i < $n; $i++)
if(preg_match($list_bots[$i], $url))
break;

if($i < $n)
{
return(true);
}
else
return(false);
}
else
return(false);
}
else
return(false);
}

--------------------------------------------------------------------------------------
 
WRInaute impliqué
J'utilise Zennoposter pour faire mes bots, ça émule un navigateur, dans la nouvelle version, tu peux changer le referer, l'os, le navigateur et émuler les frappes au clavier.

Le seul bot que tu peux détecter c'est le curl, ça n'utilise pas le js donc tu peux faire de l'ajax pour faire tes stats mais c'est très basique.

En gros si le gars et un minimum fut fut tu sauras jamais que c'est un bot, et c'est bien fait pour. Sous perl ta une librairie simulant un navigateur, en php tu peux utiliser IE...

Quoi que t'utilise ça ne marchera pas, mes robots ne laissent aucun footprint et c'est bien pour ça que je passe autant de temps dessus.
 
WRInaute accro
De l'élevage :D

@ortolojf -> balise [ Code ] BBCode c'est pas pour faire jolie sur l'interface c'est pour que les sujets et le code soit lisibles merci.
 
WRInaute accro
Rogers a dit:
Je vais poser la question con du jour, à quoi ça sert de détecter les bots ?


Bonjour Rogers

C'est pour effacer automatiquement de ma table MySQL CONNEXION, les adresses ip qui sont enregistrées dans la table des bots BOT_ADDRESS.

Je suis obligé, de les enregistrer avant de les enlever, pour que vis-à-vis des bots, le site se comporte de la même manière, que pour les visiteurs habituels.

Ainsi, je pourrai faire des stats sur mes visites et visiteurs, sans les prendre en compte. ;)

Je sais que je suis un nul pour détecter les bots, mais j'ai essayé de mettre surr pieds une fonction pour celà.

Par ailleurs, j'ai remplacé l'appel à la fonction gethostbyname() , qui est trop lente, par celle-ci :

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

Code:
function get_host($ip_address)
{
    $ptr = implode(".", array_reverse(explode(".", $ip_address))) . ".in-addr.arpa.";

    $array_host = dns_get_record($ptr, DNS_PTR);

    if($array_host != null)
    {
          for($i = 0; $i < count($array_host); $i++)
         {
                if(!empty($array_host[$i]['target']))
                {
                      return($array_host[$i]['target']);
                }  
         }
    }

    return(false);
}

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

J'ai tiré cette fonction d'un commentaire dans la rubrique sur la fonction gethostbyname(), dans le PHP Manual,

Il semblerait, qu'elle évite le long temps d'attente, dans le cas où la fonction gethostbyname() , ne trouve pas le hostname.

Bien amicalement.

Jean François Ortolo
 
WRInaute accro
Rebonsoir

J'ai réussi à trouver dans un site, plusde 1000 adresses ip de bots de moteurs de recherche, sous la forme de 4 nombres ( ip complètes ), ou les trois premiers nombres ( ip filtrées ).

J'ai inséré les ip en 4 nombres, à ma table MySQL BOT_ADDRESS, et les ip en trois nombres, à une table MySQL que j'ai créée pour l'occasion, de la forme :

BOT_IP3_ADDRESS(IP_ADDRESS VARCHAR(100) NOT NULL PRIMARY KEY DEFAULT '');

Les adresses ip, n'existent qu'en un seul exemplaire dans ces deux tables MySQL, à cause du fait que ce sont des primary key.


Ensuite,j'ai rajouté sur mon site, lors de chaque premier chargement avec une requête http, les instructions suivantes, pour éliminer systématiquement de ma table CONNEXION, les adresses des bots :

$sql = "DELETE FROM CONNEXION WHERE UNIX_TIMESTAMP(DEBUT)>" . BOT_DELAY . " AND IP_ADDRESS IN(SELECT IP_ADDRESS FROM BOT_IP3_ADDRESS)";

et :

$sql = "DELETE FROM CONNEXION WHERE UNIX_TIMESTAMP(DEBUT)>" . BOT_DELAY . " AND COMPLETE_IP_ADDRESS IN(SELECT COMPLETE_IP_ADDRESS FROM BOT_ADDRESS)";


Donc, aucune addresse de bots de moteurs, ne reste dans ma table CONNEXION.

D'autre part, dans cette table MySQL CONNEXION, le champ DRAPEAU=1 quand Javascript était activé lors de la visite, et pas désactivé juste avant la fin de la visite.

Je dois dire, qu'il y a très peu de visites avec DRAPEAU=0, ce qui était prévisible.

J'ai deux champs de type TIMESTAMP : MAINTENANT, mis à jour avec NOW() durant la même visite à chaque chargement de page, et DEBUT, qui prend la valeur NOW() au tout début de la visite.

Quant DRAPEAU=0 , si MAINTENANT=DEBUT , celà peut être, soit un bot, soit un visiteur avec Javascript désactivé, qui n'a chargé qu'une seule page.

Cependant, je logue le hostname de chaque visites dans cette table MySQL, depuis quelques minutes.

Donc, en général, les hostnames de visiteurs réels, sont alimentés, alors que pour certains bots, ils ne le sont pas ( chaîne vide quand l'ip n'a pas de reverse ).

Donc, à la limite, je pourrai alimenter deux fichiers : L'un avec les adresses ip et hostnames vides, et l'autre comportant les adresses ip et les hostnames non vides.

Je pourrai ainsi ( le nombre d'enregistrements est faible ), consulter manuellement ce deuxième fichier, pour savoir si les hostnames, semblent correspondre à des bots de moteur de recherche, et dans ce cas, ajouter ces adresses ip comme adresses de bot, à l'une ou à l'autre de ces deux tables de bots.

A part çà, pour ce qui est d'évaluer mon trafic de manière automatique, c'est délicat, mais si le champ DRAPEAU=1, je pourrais,à la rigueur, évaluer automatiquement, si des adreses ip similaires, se présentent dans des délais rapprochés, ce qui indique qu'elles ne constituent qu'une seule visite.

Je pense, que le seul critère, pour évaluer si une adresse ip est fixe ou variable, serait d'évaluer la diférence entre MAINTENANT et DEBUT, que DRAPEAU soit égal à 0 ou 1.

Si cette différence est grande, l'adresse ip est fixe.

Sinon, peut-être une visite très courte, dans ce cas, le critère discriminant, serait si une adrese ip similaire apparaît peut de temps après. Mais celà aussi peut être un hasard... ;)

Merci beaucoup de vos avis et suggestions.

Bien amicalement.

Jean François Ortolo
 
Discussions similaires
Haut