7.PHP pour le web

7.4.Captcha (anti robot) pour formulaire

7.4.1.Introduction

Nous avons vu précédemment comment créer et gérer un formulaire[c'est quoi?] en PHP[comment?]. De tels formulaires peuvent être utilisés pour envoyer un e-mail, pour ouvrir un compte, poster un message dans un forum, et tout un tas d'autres choses (comme faire une recherche dans une base de données). Seulement, si on n'y prend pas garde des personnes malveillantes peuvent créer des programmes (des robots) afin de remplir automatiquement ces formulaires et ainsi créer une "infinité" de comptes ou messages bidons, etc. avec les conséquences que l'on imagine.
Pour éviter cela, il faut rendre difficile, voire impossible, le remplissage automatique du formulaire (par un robot). Autrement dit, il faut que le formulaire ne soit remplissable que par un humain. Pour cela, un principe couramment retenu consiste à afficher du texte (un mot) mais de façon un peu brouillée de sorte que l'on puisse le lire (humainement) mais ne pas être capable de le déchiffrer par un système de reconnaissance automatique de caractères (OCR). C'est ce que l'on appelle en anglais un captcha.

7.4.2.Génération du captcha

Pour créer le captcha, vous pouvez vous appuyer sur la bibliothèque PEAR[c'est quoi?] et installer[comment?] le paquet Text_CAPTCHA.
warning Cette bibliothèque étant encore en version alpha (au moment où nous écrivons ces lignes) vous devrez donc préciser la version à installer. Exemple:
pear install Text_CAPTCHA-0.3.1
Le code minimal pour afficher le captcha est
<?php
require_once('include_path_inc.php');
require_once('Text/CAPTCHA.php');

// Instanciation d'un objet Text_CAPTCHA de type Image
$captcha = Text_CAPTCHA::factory('Image');

// Initialisation
$err = $captcha->init();
if (PEAR::isError($err)) {
    die("Erreur d'initialisation du CAPTCHA:".$err->getMessage());
}

// Recuperation de l'image au format PNG
$png = $captcha->getCAPTCHAAsPNG();
if (PEAR::isError($png)) {
    die("Impossible de creer l'image".$png->getMessage());
}

// "Affichage" de l'image
header("Content-Type: image/png");
echo $png;
?>
avec un fichier include_path_inc.php chargé d'ajouter la bibliothèque PEAR au chemin de recherche qui donne
warning
  • La bibliothèque PEAR Text_CAPTCHA ne fonctionne pas avec PHP 7.0 et plus
  • La génération de l'image nécessite (par défaut) la présence d'une police de caractère baptisées COUR.TTF dans le même répertoire que le script PHP.
  • La police COUR.TTF est disponible sous windows (sous c:\windows\fonts ?) il suffit d'alors d'en faire une copie. Pour tester sous Linux, vous pouvez vous contenter de prendre une police TTF quelconque (peut-être sous /usr/share/fonts/truetype) et la rebaptiser COUR.TTF (en majuscules) ou patienter jusqu'au chapitre suivant pour apprendre comment utiliser une autre police.
La création d'une image captcha passe par l'utilisation de la classe[c'est quoi?] Text_CAPTCHA. Il faut dans un premier temps faire appel à la méthode statique factory avec en paramètre le type de captcha. Puisque dans notre cas, il s'agit d'un captcha image, nous passons la chaîne de caractères "Image". Nous voilà maintenant avec une instance de l'objet Text_CAPTCHA (en fait Text_CAPTCHA_Driver_Image).
Il faut ensuite passer à l'initialisation par un appel à la méthode init(). Cette méthode pourra éventuellement retourner un objet PEAR_Error en cas d'erreur.
Une fois l'objet initialisé, il devient possible de réclamer le contenu binaire de l'image au format png, via la méthode getCAPTCHAAsPNG(). En cas d'erreur, la méthode retourne à la place un objet PEAR_Error.
Ce contenu est alors envoyé au navigateur via la fonction echo après avoir positionné l'entête HTTP correctement comme vu dans le chapitre "PHP et GD"[où?].