Un client (dont je ne suis pas l’auteur du site, je préfère le préciser tout de suite) m’a signalé avoir un problème de spam avec les formulaires de son site. C’est un problème récurrent qu’il est facile de corriger en quelques minutes.
Attention, cette méthode (comme toute les méthodes d’ailleurs) n’est pas infaillible. Une étude rapide, mais manuelle, du code HTML de votre formulaire permettrait certainement aux spammeurs d’identifier la solution pour continuer à vous envoyer des mails non sollicités. Mais dans 99% des cas elle suffira à bloquer les robots. Les spammeurs ne prennent, en règle générale, pas le temps d’étudier les formulaires un minimum protégés vous devriez donc être tranquille.
L’idée est simple, les robots de spam n’utilisent pas le Javascript. Par conséquent il suffit de mettre dans votre formulaire un champ caché que nous remplirons avec une fonction javascript, le PHP chargé d’envoyé l’email vérifiera alors la valeur de ce champ caché et décidera si le mail doit être envoyé ou pas.
Mise en place
Le code HTML
<form action="protection-formulaire.php"method="post"> <p> Nom:<input type="text" name="nom" /><br /> Prenom:<input type="text" name="prenom" /><br /> Message:<br /> <textarea name="message" rows="6" cols="35"></textarea> <input type="hidden" id="testBot" name="botOrNotBo" value="imBot" /> <input type="submit" value="let's go"/> </p> </form> </form>
Ci-dessus vous avez le code d’un formulaire classique où l’on a simplement ajouté un champ hidden avec comme nom « botOrNotBot » et comme identifiant « testBot »
Le javascript
<script type="text/javascript"> document.getElementById('testBot').value="imNotBot"; </script>
Le code ici est très simple, on demande au javascript de remplir le champ « testBot » avec la valeur « imNotBot ».
A noter: Ce code devra être placé en bas de votre page ou tout du moins après votre formulaire. Dans le cas contraire le champ « testBot » n’existerait pas encore au yeux de javascript et vous auriez une erreur.
Le Php
If($_POST['botOrNotBot']=="imNotBot") { //ce n'est pas un spam donc j'envoie le message } else { //C'est un spam donc je n'envoie pas le message ! }
Enfin, en ce qui concerne le PHP un simple if vérifiant la valeur du champ imNotBot permettra de savoir si oui on non nous avons à faire à un robot.
Démonstration
Pour vous donner un petit aperçu de ce que cela donne j’ai mis en ligne cette démo. Il vous suffit de tester avec et sans le javascript pour voir la différence.
Soyons discret
Pour l’exemple j’ai simplifié le code et j’ai donné des noms plutôt explicites à chaque variable. Mais il serait préférable de ne pas simplifier la vie des spammeurs en leur donnant toutes les clefs pour passer outre cette protection en un coup d’oeil.
Il est donc préférable d’utiliser des noms de variables et des valeurs anodines. De la même manière le code javascript devrait plutôt se trouver dans une fonction (au nom lui aussi anodin) elle-même placée dans un fichier externe.
Les défauts
Cette méthode de protection est extrêmement basique mais elle devrait bloquer la majorité des robots de spam. En effet, un spammeur n’est pas un hackeur son but n’est pas de chercher à déjouer les système de sécurité mais à envoyer le plus possible de mails. Par conséquent les formulaires avec un minimum de protection lui feront perdre du temps et il passera son chemin. Mais si vous tombez sur un spammeur un peu plus zélé il risque de découvrir facilement la solution pour contourner le problème, il faudra alors réfléchir à mettre en place une solution plus efficace.
L’autre problème est l’accessibilité. Avec cette méthode votre formulaire ne fonctionnera plus sans javascript. On lit un peu partout qu’il y a environ 10% d’utilisateurs qui naviguent sans javascript. J’ai un peu de mal avec cette valeur car il est difficile de savoir si, parmi ces utilisateurs, les robots sont comptabilisés. Si c’est le cas je pense que le pourcentage est en réalité bien plus faible.
<p>
Nom:<input type= »text » name= »nom » /><br />
Prenom: <input type= »text » name= »prenom » /><br />
Message:<br />
<textarea name= »message » rows= »6″ cols= »35″></textarea>
<input type= »hidden » id= »testBot » name= »botOrNotBot » value= »imBot » />
<input type= »submit » value= »let’s go » />
</p>
</form>