Skip to content

[FR] Ajouter un captcha (addons)

Thuban edited this page Feb 2, 2018 · 2 revisions

Pour ajouter le CAPTCHA généré par blogotext dans un formulaire (pour un addon par exemple), vous pouvez suivre les étapes décrites par la suite.

Comment marche le CAPTCHA ?

Lorsque le fichier inc/boot.php est appelé, il choisit aléatoirement une addition qui devra être résolue par le visiteur. Une partie de cette addition est en "chiffres" et l'autre en lettres. Le résultat est enregistré sous forme de token : il s'agit d'une somme de contrôle qui mêle le résultat de l'addition avec le n'om de l'user-agent du visiteur. Lorsque le formulaire est soumis, sont envoyés :

  • Le résultat du calcul (visible)
  • le token (caché dans le formulaire et non-éditable)

Pour savoir si le formulaire a bien été envoyé par un humain, il faut donc vérifier calculer la somme de contrôle avec le résultats du calcul donné par le visiteur et le comparer avec le token.

Mise en oeuvre

Envoi du formulaire

  1. Votre code doit inclure le fichier inc/boot.php. C'est déjà le cas pour les addons. Ce fichier génère un nouveau captcha à chaque fois qu'il est appelé.
  2. Les deux nombres à ajouter son acessibles via les variables suivantes :
  • $GLOBALS['captcha']['x']
  • $GLOBALS['captcha']['y']
  1. Un de ces deux entiers doit être écrit en toutes lettres. Une fonction est prévue pour ça : en_lettres($GLOBALS['captcha']['y'])
  2. Le token est calculé par inc/boot.php. On peut l'inclure au formulaire en le cachant ainsi : hidden_input('your_input_token', $GLOBALS['captcha']['hash'])

Vérification du captcha

  1. On récupère le résultat du calcul : $datas['captcha'] = filter_input(INPUT_POST, 'your_input_captcha', FILTER_SANITIZE_SPECIAL_CHARS);
  2. On récupère le token : datas['token'] = filter_input(INPUT_POST, 'your_input_token', FILTER_SANITIZE_SPECIAL_CHARS);
  3. Pour vérifier le captcha, il faut recalculer la somme de contrôle et la comparer avec le token reçu :
// user agent
$ua = (isset($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
if ($datas['token'] != sha1($ua.$datas['captcha'])) {
// error ! 
}