Les captchas anti-bot

Formation

En Semi-présenciel Paris

Prix sur demande

Description

  • Typologie

    Formation

  • Méthodologie

    En semi-présentiel

  • Lieu

    Paris

Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.

Les sites et dates disponibles

Lieu

Date de début

Paris ((75) Paris)
Voir plan
7 Cité Paradis, 75010

Date de début

Consulter

Questions / Réponses

Ajoutez votre question

Nos conseillers et autres utilisateurs pourront vous répondre

À qui souhaitez-vous addresser votre question?

Saisissez vos coordonnées pour recevoir une réponse

Nous ne publierons que votre nom et votre question

Emagister S.L. (responsable du traitement) traitera vos données pour mener des actions promotionnelles (par e-mail et/ou téléphone), publier des avis ou gérer des incidents. Vous pouvez consulter vos droits et gérer votre désinscription dans la politique de confidentialité.

Les Avis

Le programme

Introduction du cours

Votre site est envahi par des inscriptions de bots (des robots qui s'inscrivent plusieurs fois à des sites dans le but de publier des messages publicitaires sur un livre d'or ou un forum, ou pour utiliser des comptes mail) ?
Il existe de nombreuses solutions pour empêcher ces bots d'agir. Dans ce tutoriel, vous apprendrez à en coder quelques-unes en PHP.

En plus de vous apprendre à créer des captchas, ce cours va vous apprendre - je l'espère - à utiliser des outils méconnus de PHP et des notions informatiques un peu plus complexes. ;) Dans le premier chapitre, vous apprendrez à réaliser un captcha textuel sous la forme d'une question, puis vous découvrirez comment manipuler le hasard avec PHP et générer des chaînes de caractères aléatoires.
Dans le deuxième chapitre, nous nous concentrerons sur la bibliothèque GD et sur quelques fonctions intéressantes : utiliser une police true type, créer des effets tels que des rotations et des flous avec des matrices de convolution, etc.
Enfin, dans le troisième chapitre, nous aborderons la manipulation de données binaires : d'abord la théorie, puis la pratique avec PHP.

Créer un captcha

Un captcha est un test destiné à différencier un humain d'une machine.
Ces tests, généralement présentés sous la forme d'une image déformée ou d'une question, sont utilisés sur Internet dans les formulaires pour éviter les envois par des robots.

Ils sont utilisés contre le spam, dans les forums ou dans les commentaires d'articles de blogs, dans les formulaires d'inscription, contre les tentatives d'attaque par force brute et également contre la participation automatique à des sondages.

Les captchas textuels

Un captcha textuel est un système qui demande une information à l'utilisateur à partir d'une question que seul un humain peut comprendre.
Par exemple : « combien font 3 plus 5 ? » Même si un ordinateur pourrait faire le calcul, on suppose qu'il ne comprend pas la question.

Voici quelques exemples :

  • « Recopiez le mot maison » ;

  • « Entrez la somme de 5 et 6 ».

Recopier un mot

Dans cette première partie, nous allons réaliser un captcha qui demande à l'utilisateur de taper un mot.

Vous pouvez voir un exemple sur le formulaire du forum ubuntu-fr : http://forum.ubuntu-fr.org/.

L'organisation du script

Nous allons utiliser trois fichiers PHP :

  • formulaire.php (le formulaire) ;

  • verification.php (la page de vérification) ;

  • captcha.php (le fichier pour l'algorithme du captcha).

Le formulaire

Il s'agit d'un formulaire HTML tout simple avec un champ text pour le captcha.

<form action="verification.php" method="post"> <p> <label for="nom">Votre nom</label> <input type="text" name="nom" id="nom" /><br /> <label for="captcha">Recopiez le mot : ""</label> <input type="text" name="captcha" id="captcha" /><br /> <input type="submit" value="envoyer" /> </p> </form>

Nous écrirons le mot une fois l'algorithme du captcha réalisé.

L'algorithme du captcha

Nous avons deux possibilités : générer un mot au hasard ou en sélectionner un parmi une liste prédéfinie. Bien que la seconde solution soit la plus facile, nous verrons les deux.

Un mot parmi une liste

La liste de mots sera un tableau. Pour choisir aléatoirement un mot de ce tableau, on utilise la fonction array_rand().

<?php function motListe() { $liste = array('internet', 'captcha', 'robot'); return $liste[array_rand($liste)]; } function captcha() { return motListe(); } ?>

Il faut maintenant afficher ce mot dans formulaire.php et l'enregistrer quelque part pour que verification.php puisse vérifier que l'utilisateur a saisi le bon mot.

On utilise les sessions pour transmettre le mot d'une page à l'autre.

Il faut penser à ajouter <?php session_start(); ?> en haut de chaque page (formulaire.php et verification.php). Le fichier captcha.php étant inclus dans formulaire.php, la session sera déjà initialisée et il n'y aura donc pas besoin d'ajouter cette ligne de code.

Dans formulaire.php

On inclut la page captcha.php avec <?php require('captcha.php'); ?> et on écrit le mot dans le label avec :

<label for="captcha">Recopiez le mot : "<?php echo captcha(); ?>"</label>

.

Dans captcha.php

Il faut penser à sauvegarder le mot dans une session ; on modifie donc la fonction captcha() :

<?php function captcha() { $mot = motListe(); $_SESSION['captcha'] = $mot; return $mot; } ?> Vérification

Maintenant, nous allons nous occuper de verification.php.

Il s'agit juste de vérifier que $_POST['captcha'] est égale à $_SESSION['captcha'].

Voici le code de verification.php :

<?php if(!empty($_POST['captcha']) && !empty($_POST['nom'])) { if($_POST['captcha'] == $_SESSION['captcha']) echo 'Le captcha est bon, votre nom est '.$_POST['nom']; else echo 'Le captcha n\'est pas bon.'; } else echo 'Il faut remplir tous les champs.'; ?>

Pensez à appeler la fonction session_start() au début du script !

Exemple

Recopier un mot (dictionnaire)

Au lieu de saisir vous-même la liste de mots, il peut être amusant d'en choisir un au hasard dans un dictionnaire.

Il suffit juste de trouver un fichier texte « dictionnaire ». Pour cela, je vous conseille Google.

Pour ma part, je prends ce dictionnaire dic-iso.text (version UTF-8 : dico-utf8.text).

Ensuite, il suffit de modifier dans le fichier captcha.php la fonction motListe().

<?php function motListe() { $liste = file('dico.text'); return trim($liste[array_rand($liste)]); } ?>

Il est nécessaire d'utiliser la fonction trim() car le mot contient le \n de fin de ligne.

Exemple

Recopier un mot aléatoire

Nous allons, dans cette partie, demander au visiteur de recopier un mot non pas choisi dans une liste, mais généré au hasard.
On va donc écrire une nouvelle fonction dans captcha.php : motHasard($n).

Cette fonction génère un mot au hasard de $n caractères.

Il existe des dizaines (des centaines ?) de méthodes pour générer un mot au hasard ; nous allons en étudier quelques-unes, c'est assez amusant. :)

Une séquence de caractères aléatoires

Une méthode utilise les fonctions de hash. Bien que ce ne soit pas leur but premier, ces fonctions permettent d'obtenir des séquences de caractères aléatoires si l'on passe en paramètre une chaîne aléatoire.

Bon, on tourne un peu en rond puisqu'il nous faut une chaîne aléatoire au départ ! Mais PHP propose plein de fonctions pour cela :

  • uniqid ;

  • mt_rand ;

  • microtime ;

  • ...

Modifions notre fichier captcha.php pour obtenir ceci :

<?php function motHasard($n) { // Séquence aléatoire return substr(md5(uniqid()),0,$n); } function captcha() { $mot = motHasard(6); $_SESSION['captcha'] = $mot; return $mot; } ?>

Bien sûr, vous pouvez utiliser d'autres combinaisons dans la fonction motHasard(). En voici quelques-unes :

<?php function motHasard($n) { // Séquence aléatoire (en choisir une) $mot = substr(md5(uniqid()),0,$n); $mot = substr(sha1(rand()),0,$n); $mot = substr(strrev(time()),0,$n); $mot = substr(str_pad(next(explode('.',microtime(true))),$n,'0'),0,$n); $mot = str_pad(mt_rand(0,pow(10,$n)-1),$n,'0'); return $mot; } ?> Une séquence de lettres

Dans la partie précédente, nous avons surtout travaillé avec des chaînes de chiffres (ou de caractères hexadécimaux). Maintenant, nous allons voir comment générer une chaîne de caractères alphabétiques aléatoires.

Il s'agira uniquement de modifier la fonction motHasard().

On peut, par exemple, piocher au hasard dans un tableau de caractères :

<?php function motHasard($n) { $lettres = array_merge(range('a','z'),range('A','Z'),range('0','9')); $nl = count($lettres)-1; $mot = ''; for($i = 0; $i < $n; ++$i) $mot .= $lettres[mt_rand(0,$nl)]; return $mot; } ?>

Maintenant, nous allons coder une fonction qui donne un mot « prononçable », c'est-à-dire dans lequel les voyelles sont suivies de consonnes.

La subtilité est de définir un tableau de voyelles et un de consonnes.

<?php function motHasard($n) { $voyelles = array('a', 'e', 'i', 'o', 'u', 'ou', 'io','ou','ai'); $consonnes = array('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm','n', 'p', 'r', 's', 't', 'v', 'w', 'br','bl', 'cr','ch', 'dr', 'fr', 'dr', 'fr', 'fl', 'gr','gl','pr','pl','ps','st','tr','vr'); $mot = ''; $nv = count($voyelles)-1; $nc = count($consonnes)-1; for($i = 0; $i < round($n/2); ++$i) { $mot .= $voyelles[mt_rand(0,$nv)]; $mot .= $consonnes[mt_rand(0,$nc)]; } return substr($mot,0,$n); // Comme certaines syllabes font plus d'un caractère, on est obligé de couper pour avoir le nombre exact de caractères. } ?>

Exemple

Maintenant, à vous de choisir la fonction que vous préférez. L'avantage est qu'avec l'agencement des fichiers que nous avons défini au début (formulaire.php, captcha.php, verification.php), vous pouvez générer n'importe quel type de captcha, il n'y aura qu'une seule fonction à changer (la fonction captcha()). Vous pouvez donc utiliser ce script dans n'importe lequel de vos sites (voire l'ajouter à un formulaire déjà existant).

Une question mathématique

Dans cette partie, nous allons demander à l'utilisateur de répondre à une question mathématique.
Par exemple : « combien font deux plus huit ? » Malgré l'apparente simplicité de cette question, elle permet d'éliminer les robots car ils ne peuvent pas comprendre le sens de la question.

On génère deux nombres au hasard, on calcule leur somme, et on affiche une question en toutes lettres.

Voici une idée de code :

<?php function captchaMath() { $n1 = mt_rand(0,10); $n2 = mt_rand(0,10); $nbrFr = array('zero','un','deux','trois','quatre','cinq','six','sept','huit','neuf','dix'); $resultat = $n1 + $n2; $phrase = $nbrFr[$n1] .' plus '.$nbrFr[$n2]; return array($resultat, $phrase); } function captcha() { list($resultat, $phrase) = captchaMath(); $_SESSION['captcha'] = $resultat; return $phrase; } ?>

J'utilise la structure de langage list() que vous n'avez peut-être pas encore vue : elle transforme un tableau en une liste de variables.

Il n'y a pas besoin de modifier le fichier verification.php.
Dans le fichier formulaire.php, vous pouvez remplacer :

<label for="captcha">Recopiez le mot : "<?php echo captcha(); ?>"</label>

par :

<label for="captcha">Combien font <?php echo captcha(); ?></label>

.

Sur cette base de code, vous pouvez inventer plein de types de captchas. ;)

Exemple

Maintenant que nous avons vu comment réaliser un captcha textuel, nous allons nous intéresser aux images.

Mais avant cela, sachez que les captchas textuels sont les plus simples à réaliser... et à contourner.
Lisez cet article qui illustre bien le problème : http://www.seoblackout.com/2007/12/30/ [...] ions-calculs/.

Les captchas graphiques

Dans ce chapitre, nous allons créer une image anti-bot (un captcha) : ce chapitre utilise l'architecture de fichiers fournie dans le chapitre Les captchas textuels. Il est donc important d'avoir lu au moins la première partie.

Les captchas graphiques sont très difficilement lisibles pour un robot : très peu arrivent à identifier les caractères, surtout s'ils sont déformés ou en partie masqués.

Nous utiliserons tout au long de ce tutoriel la bibliothèque GD. Le tuto officiel du site sur cette bibliothèque devrait vous aider à l'installer et à l'utiliser (je vous recommande cependant de lire un peu la doc).

-->

Voici la première et la dernière image que nous allons créer.

Mise en garde : les captchas présentés ici ne sont pas très résistants face aux robots et ne feront pas le poids face à un robot développé exprès contre eux, gardez cela à l'esprit. Le but de ce tuto est avant tout de vous enseigner comment réaliser un captcha, pas d'en fournir un à toute épreuve.
Le dernier captcha réalisé est toutefois plutôt efficace.

Une image simple

Dans un premier temps, nous allons réaliser une image simple contenant une certaine chaîne de caractères. La chaîne de caractères sera générée par une fonction que nous avons vue dans le premier chapitre, nous nous concentrerons ainsi sur l'image.

La chaîne de caractères

On utilisera la fonction :

<?php function nombre($n) { return str_pad(mt_rand(0,pow(10,$n)-1),$n,'0',STR_PAD_LEFT); } ?>

Renseignez-vous sur les fonctions utilisées (str_pad, mt_rand et pow) si besoin.

La différence avec nos autres scripts (chapitre 1) est que captcha.php génère maintenant une image, il faut donc le modifier comme ceci :

<?php function image($mot) { } function nombre($n) { return str_pad(mt_rand(0,pow(10,$n)-1),$n,'0',STR_PAD_LEFT); } function captcha() { $mot = nombre(5); $_SESSION['captcha'] = $mot; image($mot); } header("Content-type: image/png"); captcha(); ?> Fonction de génération de l'image

On crée une fonction image($mot) qui prend en paramètre la chaîne de caractères à écrire dans l'image.
Cette fonction générera l'image et l'affichera.

Pour connaître la largeur de notre image, on va utiliser...

Les captchas anti-bot

Prix sur demande