SecurePost - Comment éviter les robots spammeurs sur son site perso en PHP.

Qu'il est loin le temps où la publicité n'existait pas sur l'Internet! Tellement loin que vous vous demandez comment cela a pu vraiment exister un jour. Comme si cette avalanche continue de publicité ne suffisait pas, vous avez peut-être remarqué que des robots passent leur temps à envoyer des liens dans les formulaires des sites web. Voici une méthode simple pour s'en affranchir sans gêner l'utilisateur final.

Observons ce formulaire dont le code est ci-dessous:
 
code source PHP sur le serveur
<?php
session_start(); // indispensable pour pouvoir manipuler les sessions
?>
<form method="post" action="securepost.php">
<input type="text" name="monpost">
<input type="submit" value="SecurePost!">
<?php
$token=md5(time());
$_SESSION['token']=$token;
echo "<input type=\"hidden\" name=\"token\" value=\"".$token."\">";
echo "<!-- php SecurePost by roudoudou copyright 2007 -->\n";
?>
</form>


code HTML généré et envoyé au navigateur client
<form method="post" action="securepost.php">
<input type="text" name="monpost">
<input type="submit" value="SecurePost!">
<input type="hidden" name="token" value="cc1dad614027b36fa479b913ab8f65c0">
<!-- php SecurePost by roudoudou copyright 2007 -->
</form>
Le formulaire contient un champ de type hidden. Cela veut dire que le champ est caché. La valeur qu'il contient est un MD5. Cette valeur est générée aléatoirement à l'affichage du formulaire. Elle est stockée dans la variable token et une copie est réalisée sur le serveur dans la session utilisateur.

Comme ces deux variables vont être comparées à la réception des données, il est obligatoire de faire une demande avant d'envoyer les données, ce que ne font pas les robots spammeurs qui envoient des formulaires tout faits (ça leur fait deux fois plus d'envois, c'est plus rentable).

Sur la page du formulaire, il n'y aura plus qu'à comparer les deux valeurs:
code source PHP sur le serveur
<?php
if (isset($_POST['token']) && isset($_SESSION['token'])) // le test n'est fait que si tout est rempli
{
if ($_SESSION['token']!=$_POST['token']) // on compare
  exit; // ou un message d'erreur
else
  echo "formulaire reçu!";
}
?>


Pour tester l'efficacité du test, voici une nouvelle version du formulaire où il est possible de modifier la valeur du jeton. Le champ de type hidden a simplement été changé en type text. Amusez-vous à changer des chiffres ou ajouter des lettres bizarres.
  MD5=
code source PHP sur le serveur
<?php
session_start();
?>
<form method="post" action="securepost.php">
<input type="text" name="monpost">
<input type="submit" value="SecurePost!">
<?php
$token=md5(time());
$_SESSION['token']=$token;
echo "<input type=\"text\" name=\"token\" value=\"".$token."\">";
echo "<!-- php SecurePost by roudoudou copyright 2007 -->\n";
?>
</form>




Ce code source est distribué sous la licence Creative Commons Paternité - Pas d'Utilisation Commerciale 2.0 (sauf autorisation)

Revenir à l'index des sources disponibles

cliquez ici pour m'écrire