3 astuces pour bloquer les commentaires-spam de votre blog

Bloquer les commentaires spam blog Il se peut que vous soyez confronté à une vague de commentaires de spam, qu'il vous faut, régulièremeent, supprimer à la main : une sacrée perte de temps. Voici comment il est possible de "limiter la casse". Nous allons utiliser plusieurs techniques : utilisation d'un dictionnaire, système de tocken javascript, et blockerip. Chacune de ces techniques peut être utilisée seule, mais les 3 combinées me semblent donner un très bon résultat. 1) Utilisation d'un dictionnaire. Créons une fonction qui tentera de détecter un spam. Pour être original, appellons la is_a_spam($string). Créons un fichier dictionnaire, il contiendra les mots à détecter : si un mot est rencontré dans le commentaire, alors le commentaire sera détecté comme du spam. Le dictionnaire est donc à adapter au sujet de votre blog... Pour faire, là aussi, original, appellons ce fichier "dictionnaire.txt". Insérez ensuite une expression/mot par ligne, dans votre fichier dictionnaire. Par exemple
[url insurance viagra
(ces 3 expressions seront bloquées). On obtient :
<?php function is_a_spam($string){ $f=file("dictionnaire.txt"); foreach($f as $word){ if(eregi($word, $str))return true; }   } ?>  
Il suffit ensuite, lors de la soumission du formulaire de commentaire, de vérifier le contenu du post :
<?php if(is_a_spam($_POST['le_commentaire']))die('Ne spammez pas mon blog !'); ?>
  2) Utilisation d'un token javascript Le javascript est executé par le navigateur. Et, que je sache, curl n'est pas vraiment un navigateur, il n'exécutera donc pas le javascript. Nous allons donc créer une fonction javascript qui renseignera un champs de formulaire bien particulier. Il suffira ensuite de vérifier la valeur envoyée en post, et de comparer.   Commençons par créer une fonction qui générera un tocken. Ici non plus, nous ne ferons pas dans l'originalité : appelons cette fonction "generer_token" :  
<?php function generer_token() { if($_SESSION['token'])return $_SESSION['token']; $token = md5(uniqid(rand(), true)); $_SESSION['token'] = $token; return $token; } ?>
En appellant cette fonction, on obtient une valeur totalement aléatoire. Maintenant, insérons un champs qui sera dédié à ce token dans notre formulaire :
<input type="hidden" name="token" value="" class="token" />
Ce qui est important ici est l'attribut class. Nous allons nous en servir pour renseigner le champs. (d'ailleurs, je vous conseille d'adapter les codes en changeant le nom de la classe et la valeur "name" ) Créons une page get_token.php (idéalement, vous devriez changer ce nom), qui affichera le token.
<?php include "fonction_generer_token.php"; @session_start(); $token=generer_token(); die($token); ?>  
Ensuite, créons une fonction javascript qui utilisera jquery, et renseignera le champs de formulaire :
function add_token(){ $.get('/get_token.php', function(d){ $('.token').each(function(d){ $(this).val(d) }); }); }
L'idée est de récupérer, en javascript, la valeur du token en chargeant (en ajax) la page get_token.php créée précédemment. Ensuite, on parcourt tous les éléments ayant la class "token", et on y insère la valeur du token. On rajoute la petite ligne qui executera notre fonction après le chargement de la page :
$(document).ready(function(){add_token();});
  Ensuite, il faut vérifier en php, dans la page qui recoit le commentaire, que le token transmis correspond au token stocké en session.
<?php if($_POST['token']!=generer_token())die('Ne spammez pas mon blog !'); ?>
  3) Utilisation de blockerip.   Nous allons utiliser blockerip.com qui permet, via une api, de bloquer un certain nombre d'adresses ip, tout en détectant les user_agent de la plupart des bots spammeurs. On obtient, après inscription (gratuite), un code du genre :
<?php function blockerip(){ $ip = $_SERVER['REMOTE_ADDR']; $url = 'http://blockerip.com/ip:'.$ip.'_api:xxxxxxx'; $header[] = "Pragma: "; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); $state = curl_exec($ch); if($state=='allowed'){$_SESSION['blockerip']=true;return ;} else die($state); } if(!isset($_SESSION['blockerip'])){blockerip();} ?>
Ajoutons ce code à notre fichier get_token.php. Nous obtenons, au final, ce code :
<?php include "functions.php"; @session_start(); $token=generer_token(); function blockerip(){ $ip = $_SERVER['REMOTE_ADDR']; $url = 'http://blockerip.com/ip:'.$ip.'_api:xxxxxx'; $header[] = "Pragma: "; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); $state = curl_exec($ch); if($state=='allowed'){$_SESSION['blockerip']=true;return ;} else die($state); } if(!isset($_SESSION['blockerip'])){blockerip();}   die($token); ?>
Notre javascript va récupérer la valeur renvoyée par get_token.php, fichier qui se bloquera si blockerip détecte un spammeur.