Protection de formulaire contre les robots.
Classé dans : Programmation
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="botOrNotBot" 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>
Tags : html, javascript, php, protection formulaire
- Permalien
- maniT4c
- 16 juin 2010 11:07
- Commentaires (8)
le 16 juin 2010 à 11:54
Ou sinon on peut installer un système de questions/réponses, c’est aussi simple et ça fonctionne avec ou sans javascript
Pas besoin de mettre des questions compliquées, pour ma part j’ai mis des trucs genre 3+4 …
le 16 juin 2010 à 13:42
@Crunch, en effet, cette solution à la mérite d’être plus accessible, le formulaire ne sera pas bloqué si javascript est désactivé.
Le problème c’est qu’il est désagréable je trouve pour les utilisateurs d’avoir à remplir ce type de champ.
Dans mon cas j’ai dû par exemple protégé un formulaire avec beaucoup de champs (une demande de devis en fait), en rajouter un supplémentaire n’était pas vraiment envisageable.
Je trouve également que ça manque de professionnalisme. Sur un blog, ou un site perso ok mais sur le site d’une entreprise je trouve que ça n’a pas sa place.
Mais ta solution à le mérite d’être encore plus simple à mettre en place.
le 16 juin 2010 à 15:13
@maniT4c : C’est vrai que pour une organisation ça ne fait pas pro mais comme pour nous avec un site ou un blog c’est beaucoup selon moi mais bon après c’est une question de goût !
Sinon il y a aussi le Captcha mais la encore c’est pas top car bien souvent on a du mal à décrypter l’image …
le 16 juin 2010 à 15:56
Et pourquoi ne pas mettre un champ en hidden dans le formulaire. La pluspart des spam remplissent tous les champs, suffit alors de regarder si le champ qui est envoyé n’est pas vide, auquel cas c’est un spam.
le 16 juin 2010 à 16:50
En effet, mais j’avoue ne pas avoir essayé cette méthode donc je ne saurait dire si elle est efficace.
Il faudrait testé et voir si le spam est en effet stoppé.
le 19 juin 2010 à 14:13
Un champs en hidden ne servirait à rien, la solution de manit4c est actuellement la meilleure.
En effet quand je fait mes scripts de s… commentaire je récupère tout les champs et je remplis seulement ceux qui m’intéressent .
le 29 juin 2010 à 23:32
Malheureusement, aucune de ces méthodes ne fonctionne avec les robots actuels : le javascript est géré, les captcha sont analysés (même les opérations de type 4+5).
J’ai subit à un moment donné du spam sur mon site. La parade : faire reconnaître des images ou poser des questions longues et simples (du genre « quelle est la couleur du cheval blanc d’Henri IV). Imparable… pour l’instant.
Mais oubliez les autre Captcha, ils ne servent plus à rien.
le 30 juin 2010 à 0:16
Comme je le disai
s ce type de protection est très basique mais suffisante pour stopper les spammeur de base pour les autres il faut prévoir des protection plus profonde