Triple protection anti-spam pour formulaire BreezingForms

Comment protéger mon formulaire contre le spam sans forcément utiliser de (re)Captcha ? Existe-t-il une protection efficace ? Puis-je contrer le SPAM sur mon formulaire BreezingForms ?
Essayons de répondre à ces questions et trouver des réponses / solutions…

Niveau : Moyen
Version BF minimale requise : BreezingForms Lite

Le SPAM.

Éternel fléau de l'internet. Il existe probablement depuis qu'existe la communication par e-mail ou la publication de commentaires sur sites (blogs) et il est difficile de s'en protéger dès lors que l'on propose un formulaire en ligne pour, p.ex., être contacté depuis son site.

De nombreuses possibilités de protection ont été envisagées et en particulier par Google avec son Captcha puis reCaptcha. Ce dernier semble encore et toujours efficace mais il semble mettre un frein à la finission d'un formulaire, relève des informations sur l'utilisateur et vous soumet aux Règlement Général sur la Protection des Données. Même le reCaptcha invisible, ne demandant habituellement pas d'intervention de l'utilisateur, se permet dans le doute, de demander à ce dernier de sélectionner des images afin de s'assurer qu'il s'agisse bien d'un humain et non d'un robot.

Il existe des méthodes pour se protéger d'une grande partie de SPAMS sans forcément recourir à ces captcha's et compagnie. Et si vous optez tout de même pour le reCaptcha, les méthodes suivantes peuvent être des éléments protecteurs supplémentaires.

Même si les protections ne seront jamais efficaces à 100%, la multiplication de ces dernières permettrait de contrer une grande majorité de messages indésirables que vous pourriez rencontrez dès lors que vous publiez un formulaire BreezingFroms.

C'est que nous verrons dans ce tutoriel…

La triple protection

La triple protection consisterait en :

  1. Un test sur la durée de remplissage du formulaire
  2. L'ajout d'un champ "piège"
  3. Un test sur la présence, dans un ou des champs, de mots interdits dont vous aurez dressé la liste, cette dernière pourrait être améliorée au fil du temps…

Création du formulaire

Pour le tutoriel, j'ai créé un formulaire simple de contact avec les champs habituels, Nom (prénom), Email, Sujet, message.

J'y ai ajouter une section en tout début de formulaire dans laquelle j'ai ajouté deux champs qui me serviront pour les deux premiers types de protection (voir capture suivante).
tn triple prot 01

Ces deux champs de test peuvent être intitulés comme vous le désirez, je les ai titrés antispam 1 et hp pour le tutoriel, vous les intitulerez bien sûr de sorte qu'il soit difficile de savoir que ce sont des tests anti-spam. Leur nom sera tooken et tooken2 (différenciez bien le titre et le nom d'un champ !).

Lorsque votre formulaire est terminé, enregistrez-le (même si vous avez opéré à divers enregistrements durant sa création).

Une copie de ce formulaire complet et fonctionnel est disponible au téléchargement en fin de tutoriel. Il ne faut que le personnaliser après son installation.

Test de la durée

Généralement, un robot spammeur ne nécessite que très peu de temps pour trouver votre formulaire, le remplir et le valider. On parle de moins de 3 secondes… Il est, dans cette optique, intéressant de tester le temps entre le chargement du formulaire et sa soumission. Disons qu'un formulaire qui serait soumis moins de 10 secondes après avoir été affiché à l'utilisateur pourrait confirmer qu'il s'agisse d'un robot ou d'un humain par copier / coller. Il suffirait alors de fournir un message de remerciement bidon et de "tuer" le formulaire sans que ses données ne soient enregistrées et envoyées.

Cliquez sur le nom de votre formulaire dans son arborescence. Dans la partie des propriétés, cliquez Avancé puis Plus d'options.
triple prot 02

Activez l'onglet Pièce de formulaireAvant le formulaire → Activez Personnalisé et, dans la zone d'édition, initialisez-y la bibliothèque PHP BreezingForms à l'aide du code suivant :

$this->execPieceByName('ff_InitLib');

Faites un retour chariot et ajouter le code suivant :

$Time = time(); // Nous stockons un timestamp dans une variable
$factor= 65; // Créons un multiplicateur
ff_setValue('tooken', $Time * $factor); // Envoyons le timestamp multiplié dans le champ tooken
  • time() retourne l'heure courante, mesurée en secondes depuis le début de l'époque UNIX, (1e janvier 1970 00:00:00 GMT)
  • Le multiplicateur permet de cacher aux robots qu'il s'agisse de l'heure de chargement afin d'éviter une modification de sa valeur avant l'envoi.
  • En fin de script, on envoit la valeur dans le champ tooken.

Voici à quoi ressemble le formulaire lors du chargement de sa page.
triple prot 03

Il faut maintenant calculer le temps passé avant la soumission du formulaire.

Activez l'onglet Envoyer des pièces. Dans la section Début de soumission, cliquez le bouton radio Personnalisé afin d'afficher la zone d'insertion de script PHP.

Nous rechargeons la bibliothèque Breezingforms et la faisons suivre du script comme ci-dessous :

$this->execPieceByName('ff_InitLib');
 
// Test de la durée de remplissage du formulaire
$tooken = ff_getSubmit('tooken'); // Place la valeur du champ tooken dans la variable $tooken
if ( empty($tooken) ) {
    ff_die('Merci pour votre message (tooken vide) !' ); // Si le champ est vidé, on remet un message de remerciement et on sort du formulaire
} else { // calcul du temps de remplissage du formulaire
    $FormCallTooken = intval($tooken);
    $TimeFactor = 65;
    $CallTime = $FormCallTooken / $TimeFactor;
    $now = new DateTime('now');
    $secondsDiff = time() - $CallTime;
    if ( $secondsDiff < 20) {

      ff_die('Merci pour votre message (trop rapide) !' ); // Si le délai est inférieur à 20 secondes, on remet un message et on sort
    }
    if ( $secondsDiff > 1200 ) {

      ff_die('Merci pour votre message (trop lent) !' ); // Si le délai est inférieur à 20 secondes ou supérieur à 20 minutes, on remet un message et on sort
    }
}

Vous remarquerez que l'on "tue" le formulaire et affichons un message en cas de remplissage trop rapide (moins de 20 secondes que vous pouvez adapter à votre besoin) ou de remplissage trop long (plus de 20 minutes que vous pouvez adapter à votre besoin). Pour tester ces options, vous pouvez adapter temporairement ces délais afin de vous assurer de leur foncitonnement. N'oubliez pas de les réinitialiser pour la mise en ligne du formulaire.

La mise en place du test sur la durée de remplissage est désormais foncitonnelle.

Attention :

  1. Il m'est arrivé de rencontrer un dysfonctionnement sur un site alors que sur d'autres, ça fonctionne très bien. Je n'ai pu trouver la raison du dysfonctionnement. Je vous invite dès lors à bien tester cette fonction sur vos propres formulaires si vous l'y appliquiez.
  2. Prenez garde que si un utilisateur classique remplissait le formulaire à l'aide d'un copier / coller, il tuerait probablement le formulaire suite à un délai trop court jusqu'à la validation…

Test de contenu de champ (type Honeypot).

Nous avons déjà évoqué le Honeypot dans cet article et nous allons le réutiliser ici à l'aide du champs tooken2.

Le honeypot est une technique qui teste si un champ est resté vide à la soumission du formulaire. Les robots ayant tendance à remplir tous les champs, ils se retrouveraient piégés en remplissant celui-ci.

À la suite du script précédent, tapez deux ou trois retours chariot pour séparer les différentes parties du scripts et entrez ce bout de code :

// Test de présence de texte dans un champ qui doit rester vide sous peine de tuer le formulaire
$honeypot = ff_getSubmit('tooken2');
if ( $honeypot != '' ) {
    ff_die('Merci pour votre message (honeypot) !');
}

Une nouvelle fois, en cas de remplissage de ce champ par un robot, on envoie un message de remerciement et on tue le formulaire.

Test de termes interdits

Ce troisième test consiste à vérifier le contenu du message lors de la soumission du formulaire. Il suffit de tester ce message sur des mots clés (interdits) dont vous pourrez adapter la liste à vos besoins.

En effet, les robots spammeurs insèrent des termes filtrables dans leurs spams. Un lien vers un site douteux, des termes pharmaceutiques tels Viagra, etc. Nous pouvons mettre une liste en place et la compléter au fur et à mesure que certains robots arrivent à passer le test…

Plaçons quelques termes à interdire dans un script pour commencer à traquer les indésirables. Toujours en fin du script précédent, tapez deux retours chariot afin de séparer le script du précédent et insérez le bout de code suivant :

// Test de mots suspects provenant de potentiels spams

$badWords = array('http','www','.ru','My name is','visit', 'my website', 'viagra', 'pharmacy'); // entrez les termes à filtrer entre apostrophes et séparés par une virgule.
$checkFields = array('message', 'sujet'); // renseigner ici le ou les champs devant être contrôlés, entre apostrophes et séparés par une virgule
foreach ($checkFields as $Fld) {
    $FldVal = ff_getSubmit($Fld);
    $matches = array();
    $matchFound = preg_match_all(
        '/\b(' . implode($badWords,'|') . ')\b/i',
        $FldVal,
        $matches
    );
    if ($matchFound) {
        ff_die('Merci pour votre message (mots interdits) !');
    }
}

Dans le cas présent, dès lors que le spammeur aura introduit un terme de la liste chargée dans la variable $badWords, on retourne un message de remerciement et on tue le formulaire.

Tests du formulaire

Avant de publier votre formulaire, il faut impérativement le tester sous toutes ses coutures. Vous pouvez enregistrer votre script et en sortir pour retourner à l'édition de votre formulaire et enregistrer une nouvelle fois celui-ci.

Utilisez la fonction BreezingForms Prévisualisation sur le site afin de faire tous vos tests de validation, provoquez des remplissages que vous saurez interdits afin de vérifier que toutes vos fonctions sont opérantes.

Vous remarquerez qu'à chaque message, j'ai introduit, entre parenthèses, la raison de l'échec d'envoi du formulaire, ceci afin de bien cerner la fonction testée. Naturellement, lors de la mise en ligne définitive du formulaire, il faudra supprimer ces parties.

Masquer les champs aux utilisateurs.

Afin de ne pas risquer que l'utilisateur remplisse ou modifie ces champs, il reste à les masquer. Il y a diverses options pour masquer un ou des champs, par css en ligne ou dans un fichier personnel.

Nous allons ici masquer la section contenant les deux champs à l'aide de l'option Section non visible en frontend disponible dans les propriétés avancées de la section englobant les deux champs de test.

Enregistrez ses propriétés et le formulaire. Testez une nouvelle fois votre formulaire en ligne afin de vous assurer que la section des champs anti-spam soit bien masquée.

Téléchargement

Vous pouvez télécharger le formulaire ci-après et l'installer depuis la configuration de BreezingForms en suivant éventuellement ce tutoriel (partie "Comment installer un package").

Cet article vous a plu ?
N'hésitez pas à laisser une évaluation en haut de page afin de me faire part de votre impression !

Les commentaires sont réservés aux membres enregistrés. Si vous êtes membre, veuillez vous connecter sinon, n'hésitez pas à vous enregistrer !