QuickForm2 et Text_CAPTCHA
Mis en ligne le 19 juin 2009Tags : captcha turing formulaire php
Nous allons ajouter le test de Turing pour autoriser la transmission d'un formulaire de contact. Le CAPTCHA utilisé est une simple opération arithmétique qui remplit adéquatement son rôle en plus de permettre à l'utilisateur de tester ses capacités de calcul mental. Et puis, l'on sait tous que les robots sont nuls dans ce type de calcul.
Le CAPTCHA :
L'on commence par créer l'objet puis l'on appelle les deux méthodes qui vont, l'une, créer l'opération et, l'autre, en retrouver le résultat.
$numcap = new Text_CAPTCHA_Numeral;
$operation = $numcap->getOperation();
$answer = $numcap->getAnswer();
Le formulaire :
Avec le package QuickForm2, ce formulaire est assez simple à mettre en oeuvre. Je laisse aux esprits classiques le soin d'explorer ses classes et d'en étudier le fonctionnement.
$form = new HTML_QuickForm2('form', 'post', array('name' => 'contact', 'action' => $_SERVER['REQUEST_URI']), false);
$fieldset = $form->addElement('fieldset')->setLabel('Un commentaire ?');
$user = $fieldset->addElement('text', 'user')->setLabel("Votre nom ou pseudo");
$user->addRule('required', "Ce champs ne peut être vide.");
$mail = $fieldset->addElement('text', 'email', array('size' => '30'))->setLabel("Votre adresse");
$mail->addRule('email', "Cette adresse est invalide.");
$comment = $fieldset->addElement('textarea', 'comment', array('cols' => 50, 'rows' => 4), array('label' => 'Votre commentaire'));
$comment->addRule('required', "Tst Tst.");
$captcha = $fieldset->addElement('text', 'captcha', array('size' => '10'))->setLabel("Que font " . $operation . " ?");
$captcha->addRule('required', "Entrez le résultat de cette opération si vous voulez nous envoyer votre message.")->and_($captcha->addRule('eq', "C'est pourtant pas très compliqué!", (string)$answer));
$form->addElement('submit', 'submit', array('value' => 'Envoyer'));
Vous voyez que l'opération et son résultat se retrouvent dans le formulaire :
$captcha = $fieldset->addElement('text', 'captcha', array('size' => '10'))->setLabel("Que font " . $operation . " ?");
$captcha->addRule('required', "Entrez le résultat de cette opération si vous voulez nous envoyer votre message.")->and_($captcha->addRule('eq', "C'est pourtant pas très compliqué!", (string)$answer));
La seconde règle appliquée à l'élément $captcha va vérifier l'égalité du nombre entré et du résultat, $answer.
C'est pas très compliqué mais il faut faire attention à ceci : l'attibut action du formulaire est REQUEST_URI (ou PHP_SELF si vous n'avez que faire d'éventuels paramètres passés dans $_GET).
Aussi convient-il, si l'on veut que le formulaire passe la validation, de placer $answer dans une variable de session afin que le nombre entré dans le formulaire ne soit sans cesse comparé au résultat suivant, généré lors du rechargement de la page.
L'on reprend donc le code ainsi :
session_start();
require_once ABSLPATH . '/assets/php/html_form.php';
require_once ABSLPATH . '/assets/php/Text/CAPTCHA/Numeral.php';
$numcap = new Text_CAPTCHA_Numeral;
if (!isset($_POST['captcha'])) {
$operation = $numcap->getOperation();
$answer = $numcap->getAnswer();
} else {
$operation = $_SESSION['operation'];
$answer = $_SESSION['answer'];
}
$form = new HTML_QuickForm2('form', 'post', array('name' => 'contact', 'action' => $_SERVER['REQUEST_URI']), false);
$fieldset = $form->addElement('fieldset')->setLabel('Un commentaire ?');
$user = $fieldset->addElement('text', 'user')->setLabel("Votre nom ou pseudo");
$user->addRule('required', "Ce champs ne peut être vide.");
$mail = $fieldset->addElement('text', 'email', array('size' => '30'))->setLabel("Votre adresse");
$mail->addRule('email', "Cet adresse est invalide.");
$comment = $fieldset->addElement('textarea', 'comment', array('cols' => 50, 'rows' => 4), array('label' => 'Votre commentaire'));
$comment->addRule('required', "Tst Tst.");
$captcha = $fieldset->addElement('text', 'captcha', array('size' => '10'))->setLabel("Que font " . $operation . " ?");
$captcha->addRule('required', "Entrez le résultat de cette opération si vous voulez nous envoyer votre message.")->and_($captcha->addRule('eq', "C'est pourtant pas de la science balistique !", (string)$answer));
$form->addElement('submit', 'submit', array('value' => 'Envoyer'));
if ($form->validate()) {
process_form($form->getValue());
} else {
display_form($form);
$_SESSION['operation'] = $operation;
$_SESSION['answer'] = $answer;
}
Le fichier html_form.php inclu HTML/QuickForm2.php et définit les fonctions qui se chargeront de l'affichage du formulaire.
