Astuces ⇒ PHP facebook twitter youtube

7 fonctions PHP-MySQL ⇒ & Créer un filtre anti-spam



Créer un filtre « anti-spam »

Un peu plus compliqué maintenant on va créer un filtre anti-spam mais sans recourir à des plugins ou librairies tierces. Pour ce faire on va générer des questions aléatoires via une fonction php toute bête :

/* Fichier functions.php */
function randomCaptcha()
{
    // On créer 3 array avec des valeurs permettant de construire plusieurs question
    $param1 = array('chat','chien','cheval','pigeon','singe','mouton','cochon','poisson','renard','lion');
    $param2 = array('Gérard Holtz','Vincent Lagaf','Laurence Ferrari','Michel Drucker','Jean-Pierre Foucault','Christophe Dechavanne','Carla Bruni','Patrick Sebastien','Jean-Pierre Pernaut','William Leymergie');   
    $answer = array('blanc','bleu','rouge','noir','violet','jaune','marron','rose','gris','vert'); 
   
    // On ajoute la réponse dans une variable de session
    $_SESSION['captcha'] = $answer[rand(0,9)];
   
    // Et on forme notre phrase avec des éléments des tableaux choisis au hasard
    $phrase = 'Quelle est la couleur du '.$param1[rand(0,9)].' <strong>'.$_SESSION['captcha'].'</strong> de '.$param2[rand(0,9)].' ?';
               
    return $phrase;
}

 

Et voici la page du formulaire dans lequel on intègre le captcha avec une vérification très basique côté serveur en haut du fichier :

<?php
session_start();
require ('functions.php');
   
if (isset($_POST['send']))
{
    $captcha = filter_var($_POST['captcha'], FILTER_SANITIZE_STRING);

    if (!empty($captcha) && $captcha === $_SESSION['captcha']) {
        $message = "<div style='color:#008000'>Bonne réponse ! On peut continuer le traitement, faire une redirection...</div>";
    } else {
        $message = "<div style='color:#FF0000'>Le champ de sécurité est vide ou incorrect</div>";
    }
   
    unset($_SESSION['captcha']);
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Exemple de filtre Anti Spam</title> 
        <meta name="robots" content="noindex, nofollow" />
    </head>
   
    <body>

        <?php if (isset($message)) echo $message; ?>
        <form method="post" action="<?php htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES); ?>">
            <p>
                <label for="pseudo">Pseudo :</label><br />
                <input id="pseudo" type="text" name="pseudo" />
            </p>
            <p>
                <label for="comment">Message :</label><br />
                <textarea id="comment" name="comment"></textarea>
            </p>
            <p>
                <label for="captcha"><?php echo randomCaptcha(); ?></label><br />
                <input id="captcha" type="text" name="captcha" />
            </p>
            <p>
                <input type="submit" name="send" />
            </p>
        </form>

    </body>
   
</html>

Évidement, ce système à lui seul est loin d’avoir la même efficacité que des services comme reCAPTCHA, mais rien n’interdit d’améliorer un peu ce script

Par exemple, on peut rajouter un champ caché, vide, que le bot ira remplir sans se poser de question (honeypot), si ce champ n’est pas vide lorsque le formulaire est soumis alors c’est un bot qui à rempli le formulaire. On peut aussi interdire l’envoi du message s’il contient plus de 2 ou 3 liens, ce qui est souvent le cas du spam (attention toutefois à ne pas supprimer des messages valides). Une autre piste consiste à vérifier si le formulaire n’est pas soumis trop rapidement en ajoutant un champ caché contenant le timestamp du moment où le formulaire a été généré, il ne restera plus qu’à comparer le temps écoulé entre la génération et la soumission du formulaire.

Bref, pour l’instant il n’y a pas de solution miracle contre le spam mais en cumulant les protections on peut arriver à avoir un système anti-spam assez efficace.


Exemple ici
Changer le fond
Oregionale Skin
7astuces
Sélectionnez un Fond (11)
7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces
Fond de contenu
7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces