Pourquoi ne faut-il plus utiliser de CAPTCHA ?

CAPTCHA



Avec l’émergence des solutions comme PhantomJS, cet article n’est plus vraiment d’actualité. Les méthodes décrites sont donc plus « faillibles » qu’avant. Les utiliser reste une alternative simple à mettre en place et qui peut tout de même avoir de bons résultats.

Pour contrer le spam des soumissions automatiques de formulaires Web, nous savons tous (ou presque) que le CAPTCHA est la solution ultime.

Le CAPTCHA

Le gros inconvénient des CAPTCHAs, c’est que les vrais utilisateurs n’en raffolent pas du tout. C’est galère, compliqué, il faut le rafraîchir car certains caractères sont incompréhensibles, les personnes souffrant de dyslexie peuvent très difficilement voire pas du tout résoudre un CAPTCHA ; bref tout un tas d’arguments qui démotivent les utilisateurs.

captcha

Ces CAPTCHAs ne sont pour autant pas aussi efficaces qu’on ne le pense. Avec l’essor des logiciels de spambots comme XRumer, on sait que ce genre de logiciel est capable via de l’OCR de lire ce qu’il se trouve sur une image, et donc de remplir un CAPTCHA (parfois) correctement.

En revanche, si vous souhaitez tout de même utiliser le CAPTCHA, il faut se tourner vers celui qui a les meilleurs résultats lors des conférences de BlackHat, c’est reCAPTCHA de Google.

Alternatives au CAPTCHA

Il existe par ailleurs d’autres alternatives pour contrer les soumissions automatiques de formulaire qui sont invisibles pour les utilisateurs et/ou très peu contraignantes.

Voyons tout d’abord ce que fait un spambot et ce qu’il ne peut pas faire (dans les grandes lignes) :

  • Un spambot parcourt le formulaire (DOM) et le remplit intégralement. Il sait quel type d’information il faut ajouter selon l’id ou le name qu’il rencontre. Par exemple pour une adresse e-mail à saisir, on sait que dans 99% des formulaires, l’attribut name contient « mail », ou tout simplement, l’élément est un input[type="email"].
  • Un spambot ne peut pas interpréter le CSS
  • Un spambot ne peut pas exécuter le Javascript

Maintenant qu’on connait les principales forces et faiblesses d’un spambot, on peut trouver d’autres moyens que le CAPTCHA pour réduire significativement le spam à notre niveau.

Checkbox CAPTCHA

Ce n’est pas une méthode nouvelle, mais elle reste parmi les plus efficaces. Elle consiste à générer en Javascript une case à cocher qui devra être obligatoirement cochée afin que le formulaire soit considéré comme valide.
Un spambot n’exécutant pas le JS, il ne « verra » pas cet élément, son formulaire sera donc invalide. En revanche pour un utilisateur réel, une case à cocher ayant un label du type « Je confirme ne pas être un robot » est peu contraignante et très efficace.

Exemple de code jQuery pour ajouter une checkbox :

jQuery:
$('<input type="checkbox" name="nobot" required="true"> Je confirme ne pas être un robot').prependTo($('#maDiv'));

Côté serveur (exemple PHP), une simple condition suffira :

php:
<?php
if(isset($_POST['nobot'])) {
    // la case est cochée 
}
?>

Le pot de miel (honeypot)

Encore une méthode méconnue, peu récente également et tout aussi efficace que la précédente. Elle intervient encore une fois côté client et elle a la particularité de ne nécessiter aucune action de le part de l’utilisateur.

Cette solution se fait uniquement en HTML et CSS. J’ai précisé précédemment qu’un spambot ne pouvait « comprendre » le CSS, ce n’est pas trop son truc. Autant s’en servir alors.

Le pot de miel consiste à ajouter un champ texte classique en fin de formulaire mais qui sera masqué en CSS. Un utilisateur ne verra donc pas ce champ et il ne le remplira pas ; or un spambot lui le verra et le remplira. Pour rendre le formulaire valide, il suffit donc de contrôler que ce champ est bien vide.

Conseils : mettre un label au champ du type « Si vous êtes un humain, laissez ce champ vide », ainsi les utilisateurs de lecteurs d’écran comprendront l’utilité de ce champ. Il vous faut donc créer un conteneur qui englobe le label et le champ, et lui mettre une classe par exemple « hp », évitez « honeypot »…
Idem pour le name du champ, autant mettre quelque chose qui fera que le spambot tombera à coup sûr dans le piège, « comment », « username »…
form.html:
<div class="hp">
<label>Si vous êtes un humain, laissez ce champ vide</label>
<input type="text" name="comment">
</div>
styles.css:
.hp {
    display: none;
}
php:
<?php
if(empty($_POST['comment'])) {
    // le champ est vide
}
?>

Autres types de CAPTCHA

Je vous invite également à regarder ces solutions :

Conclusion

Rien ne vous empêche de combiner les deux méthodes présentées dans un formulaire. Il existe tout un tas d’autres solutions pour remplacer les CAPTCHAs…
A noter aussi qu’il existe des services payants qui proposent la résolution de CAPTCHA (ou tout autre validation de formulaire) par des humains, le spam existera toujours ! *-)



Laisser un commentaire

(*) champs obligatoires ;)