Un antispam sur votre site - La technique du pot de miel

Par Nouvelle-Techno.fr le 19 février 2020 - Catégories : Javascript PHP Tutoriel

Lire l'article sur le site d'origine

Si vous possédez un site web, vous y proposez certainement un formulaire de contact qui permet à vos visiteurs de vous envoyer un message directement, sans quitter le site et sans connaître votre adresse e-mail.

Le gros inconvénient de ce formulaire de contact réside dans le fait qu'il s'agit d'une porte d'entrée pour les spams en tous genres, qui peuvent rapidement remplir votre boîte mail.

Pour éviter de perdre votre temps à trier ces nombreux e-mails, il existe plusieurs solutions, comme le Captcha, par exemple, qui demande de recopier un code, ou la case "Je ne suis pas un robot". Une autre solution plus simple à mettre en place et très discrète pour les visiteurs s'appelle Honeypot (“Pot de miel”, en français).

La technique du pot de miel : comment ça marche ?

La plupart des spams sont envoyés par des robots, scripts automatiques qui parcourent les sites à la recherche de formulaires. Pour un formulaire de contact, les robots se sentent obligés de remplir tous les champs proposés.

Le Honeypot consiste à insérer dans le formulaire un champ supplémentaire, masqué pour les visiteurs normaux. Ceux-ci ne le rempliront pas étant donné qu'ils ne le voient pas. Un robot, lui, le détectera et le complétera.

Créer le formulaire de base

Un formulaire de contact de base contiendra, par exemple, le code suivant

<form action="traitement.php" method="post">
    <p>
        <label for="nom">Nom :</label>
        <input type="text" name="nom" id="nom">
    </p>
    <p>
        <label for="sujet">Sujet :</label>
        <input type="text" name="sujet" id="sujet">
    </p>
    <p>
        <label for="email">E-mail :</label>
        <input type="email" name="email" id="email">
    </p>
    <p>
        <label for="message">Message :</label>
        <textarea name="message" id="message"></textarea>
    </p>
    <button>Envoyer</button>
</form>

Ce formulaire enverra l'information au fichier "traitement.php", mais sera vulnérable aux spams.

Traiter le formulaire

Notre fichier "traitement.php" permettra comme son nom l'indique de traiter le formulaire. Ce traitement, dans cet exemple, n'enverra pas de mail mais confirmera l'envoi, pour simuler le fonctionnement.

<?php

if($_SERVER['REQUEST_METHOD'] == 'POST'){
    // On vérifie que tous les champs sont remplis
    if(
        isset($_POST['nom']) && !empty($_POST['nom']) &&
        isset($_POST['sujet']) && !empty($_POST['sujet']) &&
        isset($_POST['email']) && !empty($_POST['email']) &&
        isset($_POST['message']) && !empty($_POST['message'])
    ){
        // On "nettoie" le contenu
        $nom = strip_tags($_POST['nom']);
        $sujet = strip_tags($_POST['sujet']);
        $email = strip_tags($_POST['email']);
        $message = htmlspecialchars($_POST['message']);

        // Ici vous devrez traiter les données

        echo " Message de {$nom} envoyé";

    }

}else{
    http_response_code(405);
    echo "Méthode non autorisée";
}

Mettre en place le "Pot de Miel"

Nous allons effectuer quelques modifications dans notre code pour mettre en place l'antispam, mais également se protéger contre les robots qui ne passeraient pas par le site lui même pour remplir le formulaire

Le "Pot de Miel"

Le pot de miel en lui-même prendra la forme d'un champ caché dans le formulaire. Un visiteur "normal" le laissera vide, le robot, lui, le remplira.

Nous ajouterons donc ceci à notre formulaire (le nom du champ est libre)

<input type="hidden" name="raison">

Ensuite, dans le traitement, nous allons vérifier si ce champ est vide avant de continuer. Le fichier "traitement.php" contiendra donc ceci

<?php

if($_SERVER['REQUEST_METHOD'] == 'POST'){
    // On vérifie que le champ "Pot de miel" est vide
    if(isset($_POST['raison']) && empty($_POST['raison'])){
        // On vérifie que tous les champs sont remplis
        if(
            isset($_POST['nom']) && !empty($_POST['nom']) &&
            isset($_POST['sujet']) && !empty($_POST['sujet']) &&
            isset($_POST['email']) && !empty($_POST['email']) &&
            isset($_POST['message']) && !empty($_POST['message'])
        ){
            // On "nettoie" le contenu
            $nom = strip_tags($_POST['nom']);
            $sujet = strip_tags($_POST['sujet']);
            $email = strip_tags($_POST['email']);
            $message = htmlspecialchars($_POST['message']);

            // Ici vous devrez traiter les données

            echo " Message de {$nom} envoyé";

        }
    }

}else{
    http_response_code(405);
    echo "Méthode non autorisée";
}

Traiter uniquement les visiteurs du formulaire

Afin d'ajouter une protection supplémentaire, nous allons vérifier si le traitement est exécuté après avoir visité la page du formulaire.

De cette façon, les robots qui essaieront d'envoyer des données sans avoir chargé le formulaire seront ignorés.

Nous vérifierons la présence d'une page d'origine venant de notre site.

Le traitement contiendra donc ceci

<?php
// On vérifie que le visiteur vient du formulaire
if(isset($_SERVER['HTTP_ORIGIN']) && $_SERVER['HTTP_ORIGIN'] == "https://honeypot-exemple.test"){
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // On vérifie que le champ "Pot de miel" est vide
        if(isset($_POST['raison']) && empty($_POST['raison'])){
            // On vérifie que tous les champs sont remplis
            if(
                isset($_POST['nom']) && !empty($_POST['nom']) &&
                isset($_POST['sujet']) && !empty($_POST['sujet']) &&
                isset($_POST['email']) && !empty($_POST['email']) &&
                isset($_POST['message']) && !empty($_POST['message'])
            ){
                // On "nettoie" le contenu
                $nom = strip_tags($_POST['nom']);
                $sujet = strip_tags($_POST['sujet']);
                $email = strip_tags($_POST['email']);
                $message = htmlspecialchars($_POST['message']);

                // Ici vous devrez traiter les données

                echo " Message de {$nom} envoyé";

            }
        }

    }else{
        http_response_code(405);
        echo "Méthode non autorisée";
    }    
}

Et voilà, les spams devraient drastiquement diminuer avec cette méthode.

A noter qu'aucune méthode ne fonctionnera à 100%.

Obtenir de l'aide

Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat

#Tutoriel #Javascript #Généralités #PHP