Bonjour,
Tout d'abord, ceci est mon premier code publié, je ne sais pas s'il fonctionne, je n'ai pas encore eu l'occasion de le tester et je ne sais pas si mes postulats sont bons.
Le but de ce code est de détecter les gentils robots (comme les robots de google pour le référencement) pour exclure/bannir les autres.
Attention: Le code suivant est basé sur les postulats suivants (je ne sais pas s'ils sont valables... si un expert passe par la et s'il peut faire des commentaires la dessus, ce serait bien!)
1. Les robots de référencement (les gentils robots) vont automatiquement chercher votre fichier "robot.txt" à la racine de votre site.
2. Les robots vont très vite (plus vite qu'un humain) pour afficher les pages.
3. Un gentil robot ne va pas visiter une page qu'on lui a interdite dans notre fichier "robot.txt".
4. Un gentil robot va suivre (obligatoirement) les liens dans la page web s'ils ne sont pas interdit dans "robot.txt".
Les 2 pages dont je vais parler sont des pages dissimulées, accessibles par un lien sur un gif invisible de 1 pixel sur 1 pixel (autrement dit, il faut pas avoir de bol pour qu'un utilisateur humain clique dessus!)
- Sur toutes la pages du site, un lien mène à ces pages
- Une page (et une seule) est interdite dans le fichier robot.txt
Avec ces postulats, je peux dire que dans un laps de temps donné (on va dire 5mn):
- Un robot qui visite une page interdite est un mauvais robot (pour ça, il existe déjà des codes sources (meme sur ce site je crois))
- Un robot qui ne visite ni une page interdite ni une page autorisée (toutes les deux dissimulées) pendant un laps de temps de xx minutes (5mn dans mon code) et qui fait xx requetes pendant ce laps de temps est un mauvais robot (en gros, le robot a été programmé pour n'atteindre que certaines pages de votre site).
- Un robot qui ne visite pas la page interdite mais qui visite la page autorisée s'identifie comme un gentil robot.
A chaque fois qu'on vérifie le comportement du robot, on supprime les entrées anterieures à 5mn pour ne pas bannir par la suite un utilisateur gentil qui aurait récupéré une IP bannie...
Source / Exemple :
<?php
/* Commentaires
page 1.html = page interdite par robot.txt et lien caché
Sur page 1.html, la variable $page=1;
page 2.html = page autorisée mais lien caché
Sur page 2.html, la variable $page=2;
Table qui sert à ça (à créer):
ip_ban => ip,1,2,status,requests,timestamp ou "ip,1,2...." sont les noms des champs
//--- Le code suivant est à insérer sur toutes les pages du site. ---\\
// définition des attributs pages 1 et 2
if($page==1)
{ $un="Y"; }
else
{ $un="N"; }
if($page==2)
{ $deux="Y"; }
else
{ $deux="N"; }
// Récupération IP.
$ip=$_SERVER['REMOTE_ADDR'];
// Définition du temps du bannissement (modifiable à souhait)!
$ban_time=300 // correspond à 5mn en secondes (5*60)
// Récupération du timestamp actuel:
$timestamp=time();
// Limite du bannissement
$ban_limit=$timestamp-$ban_time;
// maximum de requetes
$max_requests=100;
// Connection MYSQL (à customiser selon vos propres paramètres!
include("Connections/Annuaire.php");
/*
On supprime toutes les entrées de la table dont le timestamp est inferieur
à 5mn du timestamp actuel (il ne s'agit pas de bloquer l'accès a des personnes qui récupereraient une ip bannie en se connectant!)
mysql_query("DELETE FROM ip_ban WHERE ip_ban.timestamp<='$ban_limit'");
// Vérification si IP du visiteur est déjà dans notre base:
$verif=mysql_query("SELECT ip,1,2,status,requests,timestamp FROM ip_ban WHERE ip_ban.ip='$ip'");
$count=mysql_num_rows($verif);
$data_ip_ban=mysql_fetch_array($verif);
// Si count<>0 alors on vérifie si l'ip est bannie, si oui, on n'affiche pas le contenu de la page demandée
if($count==0)
{
mysql_query("INSERT INTO ip_ban VALUES('$ip','$un','$deux','OK','1','$timestamp')");
}
else
{
$table_un=$data_ip_ban['1'];
$table_deux=$data_ip_ban['2'];
$table_status=$data_ip_ban['status'];
$table_requests=$data_ip_ban['requests'];
$table_timestamp=$data_ip_ban['timestamp'];
if($table_un=="Y" || ($table_un=="N" & $table_deux=="N" && $table_requests<$max_requests))
{
echo "vilain robot!!!!"
// et on n'en profite pour ne pas afficher la page!
}
else
{
// on incrémente le nombre de requêtes
// on remet a jour la valeur du timestamp
$table_requests=$table_requests+1;
if($table_un=="N" & $un=="Y")
{ mysql_query("UPDATE ip_ban SET 1="Y",requests='$table_requests', timestamp='$timestamp' WHERE ip_ban.ip='$ip'"); }
if($table_deux=="N" & $deux=="Y")
{ mysql_query("UPDATE ip_ban SET 2="Y",requests='$table_requests', timestamp='$timestamp' WHERE ip_ban.ip='$ip'"); }
// ICI LE CONTENU DE VOTRE SITE!
}
}
?>
Conclusion :
Voila... Je rappelle que je ne suis pas sur de mes postulats ni de ma méthode...
Des questions/commentaires/suggestions...? Je suis preneur!
Merci d'avoir passé un peu de votre temps à lire ce petit algorythme