Formulaire anti spam : STOP aux captchas !

captcha

Il y a des choses parfois qui m’énervent et en ce moment ce sont tous ces sites qui utilisent des captcha dans le but de lutter contre le spam sur un formulaire. Outre le fait que le Captcha n’est pas un système infaillible (les robots spammeurs en cassent un grand nombre), ce système est lourd pour l’utilisateur moyen et gênant pour les personnes souffrant de problèmes visuels. Certes pour ces dernières, il existe une fonction auditive leur permettant d’écouter le captcha, mais très peu de systèmes en sont équipés. Enfin bref, le captcha est un système pénible, il suffit de lire l’article à ce sujet sur Wikipedia : http://fr.wikipedia.org/wiki/Captcha.et je vais vous montrer comment installer un système moins contraignant, invisible et tout aussi efficace.

Voici la problématique rencontrée à l’époque. Sur un site personnel que j’ai relancé il y a 1 an et demi, j’avais créé un système de commentaires simple afin que les visiteurs puissent commenter les actualités que je postais. Problème, ce système s’est vite retrouvé spammé avec une trentaine de spams par jour. N’ayant pas le temps de modérer tous les jours, j’ai donc installer mon propre système sans captcha. Le résultat est flagrant : en 1 an, j’ai eut 0 spam.

La première chose à faire pour le formulaire, c’est d’installer un système de « minuterie ». A chaque fois qu’un visiteur arrive sur la page, le formulaire est créé et en champs caché est enregistrée la date en seconde. Lorsque le formulaire est posté, si la différence entre la date d’arrivée sur la page et la date de post est de – de x secondes (dans mons exemple 15 secondes) alors on enregistre pas. En effet, si un visiteur réel, veut commenter, il affiche la page, il lit la news (ou lit les autres commentaires s’il a déjà posté), il remplit les champs et écrit son message. J’ai estimé ce temps à 15 secondes. Vous pouvez prendre une valeur plus petites, mais plus vous la diminuez moins vous serez efficaces contre les robots qui postent toutes les X secondes. Avec cette protection, vous supprimez une bonne partie de votre spam. Il vous reste l’équivalent du captcha, mais invisible pour l’utilisateur.

Que font généralement les robots ? Ils remplissent les champs du formulaire . Le but du jeux pour les contrer c’est de mettre des champs vides que les robots voudront remplir. Attention toutefois d’en mettre plusieurs et de vérifier qu’aucun de ces champs ne soient remplis. Les robots ne remplissent pas toujours la totalité des champs dans un formulaire d’où l’utilité de mettre plusieurs champs vide, le robots en remplira forcément un ou plusieurs.

Pour information, je viens de regarder dans mes logs, sur 94 tentatives sur la journée du 26 février dernier, aucun SPAM n’est passé, preuve que ma technique fonctionne. Voici un exemple de code de formulaire, il vous faudra l’adapter à votre site.

<?php
if (isset($_POST[’submit’]))

{

//On récupère le temps en seconde pour soustraire avec celui de l’arrivée du visiteur sur la page
$antispam2= time();
$antispam = $antispam2 - $_POST[‘secondes’];

//On vérifie si au moins un des champs est rempli. Si c’est le cas, le commentaire n’est pas enregistré, c’est un robot. Je pense que l’on peut faire plus simple pour écrire cette condition, mais je n’avais pas envie de passer du temps dessus donc je l’ai écrit comme ça.
if ((($_POST[‘nom’] !="") && ($_POST[‘nom1′] !="") && ($_POST[‘nom2′] !="")) || (($_POST[‘nom’] !="") && ($_POST[‘nom1′] !="")) || (($_POST[‘nom’] !="") && ($_POST[‘nom2′] !="")) || (($_POST[‘nom1′] !="") && ($_POST[‘nom2′] !="")) || (($_POST[‘nom’] !="") || ($_POST[‘nom1′] !="") || ($_POST[‘nom2′] !=""))) {

$erreur=‘Operation impossible !!!! VILAIN ROBOT, ton spam ne passera pas AHAHAHAHA’;
} elseif ($antispam < 15 ) {

$erreur=‘Operation impossible !!!! Vous devez attendre quelques secondes avant de poster !’;
} else {
////////////////////////////////////////////
///////////////////////////////////////////

$pseudo= mysql_real_escape_string($_POST[‘author’]);

$author_email = mysql_real_escape_string($_POST[‘email’]);

$author_comment = mysql_real_escape_string($_POST[‘comment’]);

$post_comments=" INSERT INTO news_comments values ( », ‘ ".$id." ‘,’ ".$pseudo." ‘, ‘ ".$author_email." ‘, ‘ ".$_SERVER[‘REMOTE_ADDR’]." ‘, now(), ‘ ".$author_comment." ‘);";

mysql_query($post_comments);
header(‘Location: mapage.php’);
exit;
}

if (isset($erreur)) {
echo ‘<p>’.$erreur. »;

}

//On affiche le formulaire

//Gestion de l’erreur. On l’affiche.

if (isset($erreur)) {
echo ‘<p>’.$erreur.‘</p>’;

}

echo ‘<form action="mapage.php"method="post">
<p><input name="author"id="author"value=""size="22″ maxlength="22″ tabindex="1"type="text"/>

<label for="author"><small>Nom (requis)</small></label><input type="hidden"name="nom"size="10"/></p>

<input type="hidden"name="secondes"value="’.time().‘"/>
<p><input name="email"id="email"value=""size="22"maxlength="40"tabindex="2"type="text"/>

<label for="email"><small>E-mail (ne sera pas publié) (requis)</small></label></p>

<p><textarea name="comment"id="comment"rows="10"tabindex="4"></textarea></p>

<input type="hidden"name="nom1"size="15"/><input name="nom2"type="hidden"value=""/>

<p><input name="submit"id="submit"tabindex="5"value="Poster"type="submit"/>

</p>

</form>’;

?>

Le code a été alléger pour vous le donner en exemple. Vous pouvez le modifier, l’améliorer comme vous le souhaitez mais la technique est radicale. En un an, sur plusieurs dizaines de milliers de tentative, aucun spam n’est passé. Et avouez que c’est toujours plus pratique (car invisible) que de demander à vos visiteurs de lire un truc illisible. Ce n’est pas au visiteur de s’adapter mais au webmaster de trouver la solution.

Be Sociable, Share!
  • Plus d'infos sur notre newsletter :
Vous pouvez laisser un commentaire ou un trackback depuis votre site.

Une réponse pour “Formulaire anti spam : STOP aux captchas !”

  1. En d’autre mots les captchas sont utilisés pour s’assurer que ce n’est robots mais il n’empêche que cette validation ne les arrête pas.

Laisser un commentaire