Magazine Internet

3 astuces pour bloquer les commentaires-spam de votre blog

Publié le 12 février 2011 par Gpenverne

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 :

if(is_a_spam($_POST['le_commentaire']))die('Ne spammez pas mon blog !');

2) Utilisation d'un tocken 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.

Maintenance, 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édemmebt.

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.

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 :

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.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Gpenverne 8345 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossier Paperblog

Magazine