<Palmito's blog src="Boite" alt="Biscuit" />

Mes découvertes, mes penses bêtes, un peu de Html / css / php / sql, GNU/Linux et d'informatique en général

Un captcha simple avec tableau questions / réponses


Palmito, le 2020-02-23 21:28:29

Oui je sais, il ne faut pas réinventer la roue mais sur ce site et sur d'autres petits projets, je voulais intégrer un petit captcha maison.

Utiliser des grosses solution comme reCaptcha sur de petits projets me semble un peu disproportionné..

Fut un temps, je m'occupais d'un forum propulsé par fluxbb, j'avais trouvé une petite extension captcha qui nous proposait de personnaliser le captcha avec nos questions / réponses.

Autant que je me souvienne cette solution avait plutôt bien fonctionné...bon, je ne sais pas comment le développeur s'y était pris car je ne m'intéressais pas spécialement au code à cette époque mais j'ai décidé aujourd'hui d'essayer de reproduire le même concept...

Ce ne sera certainement pas parfait, mais dans l'état actuel ça fonctionne et si vous passez par ici et que vous avez des critiques / commentaires pour améliorer ce petit code c'est avec plaisir.

Je suis parti sur 3 fichiers, un contenant le formulaire, un contenant l'array avec les questions/réponses + stockage dans variable ou session des questions/réponses et enfin un autre pour le traitement du formulaire qui va vérifier si les variables/session existent, ne soient pas vident etc...J'ai bien commenté mes petits bouts de code pour expliquer ma démarche.

Le fichier index


<?php

// require pour le tableau de questions / réponses
require 'question-answer.php';

?>



<form action="treatment.php" method="post">
    <!-- la question récupérée  -->
    <div><?= $question ?></div>
    <!-- retour éventuel renvoyé par la page de traitement -->
    <div><?= $_SESSION['msg'] ?></div>
    <div>
        <label for="">captcha</label>
        <input type="text" name="captcha">
    </div>
    <input type="submit" name="submit">
</form>

Le fichier qui contient les questions / réponses (a personnaliser), question-answer.php


<?php

// Démarrage de session pour pouvoir récupérer la réponse
session_start();

// Tableau avec les différentes questions/réponses pour notre captcha
$quiz = [
    0 => [
        'question' => 'Quel est le premier jour de la semaine?',
        'answer' => 'lundi'
    ],
    1 => [
        'question' => 'Quel est le deuxième jour de la semaine?',
        'answer' => 'mardi'
    ],
    2 => [
        'question' => 'Quel est le troisième jour de la semaine?',
        'answer' => 'mercredi'
    ],
];

// On utilise array_rand pour avoir un id aléatoire de notre tableau
$id = array_rand($quiz);
// On utilise l'id donné par array_rand pour pouvoir stocker la bonne réponse dans $_SESSION['reponse']
$_SESSION['answer'] = $quiz[$id]['answer'];
// On stock la question dans une variable toujours via l'id donné par array_rand
$question = $quiz[$id]['question'];

Et enfin le dernier qui s'occupe du traitement, treatment.php


<?php
// Page pour le traitement du formulaire

// Démarrage de session
session_start();
// Si la reponse de l'input captcha n'est pas vide
if(!empty($_POST['captcha'])){
    // On stock la reponse dans une variable en faisant une éventuelle conversion des majuscules en minuscule
    $userAnswer = strtolower($_POST['captcha']);
    // Si on envoi le formulaire
    if(isset($_POST['submit'])){
        // On compare la réponse stocké dans la session avec la réponse de l'utilisateur
        if($_SESSION['answer'] == $userAnswer){
            // Ici on stock dans session le message ok, mais on peut par exemple lancer le traitement d'un message en bdd ou d'un email.
            $_SESSION['msg'] = 'ok';
        // Si la réponse n'est pas bonne
        }else{
            // On envoi ici un message si la réponse n'est pas identique
            $_SESSION['msg'] = 'Captcha non valide...';
        }
            // Qu'on soit dans le if ou le else, on renvoit l'utilisateur sur le formulaire
            header('Location: index.php');
        }
    // else pour pour le premier if, si $_POST['captcha'] est vide (à l'arrivée sur la page par exemple), on ne passe aucun message a l'utilisateur et on redirige sur index
    }else{
        $_SESSION['msg'] = '';
        header('Location: index.php');
}

Le formulaire est des plus basique, c'était vraiment histoire de vérifier que la "mécanique" fonctionne.

Commentaires

Pas de commentaire pour cet article

Quelque chose à dire?