[3.0.x] CAPTCHAs dans phpBB Facile

[3.0.x] CAPTCHAs dans phpBB


CAPTCHAs dans phpBB
Publié par Kellanved

Un CAPTCHA - pour "Completely Automated Public Turing test to tell Computers and Humans Apart"s - est, en français, un test public de Turing totalement automatisé permettant de distinguer l'être humain d'un ordinateur. Les CAPTCHAs sont réputés être le meilleur moyen actuel de limiter l'enregistrement par les programmes diffuseurs de spams, ou "Bots". Dans phpBB, un CAPTCHA de confirmation visuelle est utilisé.

Le point important réside dans les mots "totalement automatisé", qui impliquent que le logiciel, ici phpBB, établit à la fois la question et à la fois la réponse correcte, sans intervention humaine. Toutefois, la contrepartie en est que les ordinateurs finiront bien par trouver un moyen d'élaborer la réponse attendue, au bout du temps nécessaire à la mise au point de l'algorythme adapté. Cela constitue un domaine de recherche très actif. Finalement, il s'agit d'une course à l'armement. Un nouveau système de CAPTCHA permet généralement de bénéficier d'une tranquilité de quelques mois, avant que les principaux vendeurs de Bots ne mettent leurs produits à niveau.

Cet article ne vise qu' à présenter quelques motivations quand à l'utilisation des CAPTCHAs dans phpBB ; il ne s'agit pas d'une prise de position pour ou contre les CAPTCHAs, que ce soit en général ou en particulier. Il ne s'agit pas non plus d'aborder d'autres moyens de combattre les spams. Il s'agit uniquement d'aborder le sujet constitué par les CAPTCHAs dans phpBB

Les CAPTCHAs de phpBB
Un CAPTCHA est apparu pour la première fois dans la distribution v2.0.10 de phpBB. C'est à cette époque que ce besoin est devenu une évidence : intégrer un moyen d'empêcher les Bots d'enregistrer un ou plusieurs utilisateurs. Pour être précis, un CAPTCH fut incorporé à la v2.0.5, mais pas installé. D'ailleurs, ce besoin est aussi à l'origine du portage descendant vers la v2.0, du réputé CAPTCHA de la v2.1 (v2.1 qui deviendra plus tard la v3.0). Bien que ce CAPTCHA soit finalement pas si difficile que cela à craquer, comme chacun le sait, à l'époque il a toutefois rempli son office.
Pour un temps.
Image

Le CAPTCHA originel de phpBB
Toutefois, durant le développement de ce qui deviendrait plus tard la v3.0, il devint clair que cela ne devrait pas foutre en l'air la futur version, aussi Robert 'Xore' Hetzler pris en charge le développement d'un seul nouvel ensemble de CAPTCHAs pour cette version.

L'idée consistait à disposer d'un système d'adjonction permettant une grande variété de CAPTCHAs différents, avec un grand nombre d'options. Cependant, alors que le développement cherchait à incorporer les versions béta, il fut décidé que ce système était finalement trop ambitieux pour la v3.0, et devait être remis en cause.

A sa place, les versions béta embarquèrent un système de CAPTCHA tiré d'un produit tiers issu du libre. Néanmoins, NeoThermic découvrait déjà qu'il n'était pas à la hauteur.

Image
Pour la version béta
Image
... trop facile.

Au bout du compte, le code source du CAPTCHA de Xore fut ressuscité et passé en revue pour les implémentations qui étaient compatibles avec les styles subsilver2 et prosilver, tout en restant suffisamment à part pour désarçonner les Bots. Ainsi deux algorithmes furent mis au point pour le code source réduit du CAPTCHA, et l'un des deux fut finalement retenu pour devenir le système CAPTCHA par défaut d'Olympus.

Voici celui qui fut écarté
Image
Voici celui qui fut retenu
Image

Nous l'avons sélectionné parce qu'il était très différent de ceux qui existaient ; évidemment, nous étions, et nous sommes toujours, conscients des moyens de le casser, mais cela est une autre histoire. Jusqu'à présent, l'implémentation choisie a bien tenu la route. Nous travaillons tout de même toujours sur son possible remplacement, des fois que.

Les CAPTCHAs par défaut
Le principal, pour un module de CAPTCHAs incorporé dans un logiciel comme phpBB, c'est qu'il doit satisfaire à ensemble restreint d'impératifs.
Au minimum, il doit
  1. fonctionner correctement de manière autonome
  2. fonctionner indépendamment du langage
  3. pouvoir être résolu par la plupart des humains
  4. ... et par peu de Bots

Le premier impératif est très important. En effet, il n'est pas acceptable d'obliger les internautes à se s'enregistrer par service de CAPTCHA ou par questions/réponses. Les utilisateurs pourront le faire ensuite, mais au moment de leur enregistrement, ce n'est vraiment pas une bonne idée.
On passe facilement à côté du deuxième, mais il est quand même important : le CAPTCHA doit pouvoir fonctionner quelque soit le langage et la culture de l'utilisateur.
Enfin, le troisième semble évident, mais s'avère étonnament difficile. En effet, certains ne perçoivent pas les effets 3D dans des images 2D, d'autres distinguent mal le vert du rouge, etc. Quand au quatrième, il est surtout présent pour rappeler que quelque soit la solution retenue, elle aura des failles.

Les CAPTCHAs personnalisés
Un CAPTCHA créé pour votre site est une histoire complètement différente. Dans ce cas, vous pouvez utiliser des particularités du public ciblé, comme des questions ou des images spécifiques aux sujets de votre site. En fait, même une approche simple marchera, à partir du moment qu'elle reste unique. Craquer n'importe quel CAPTCHA est une question d'heures, surtout s'il est inclus dans une distribution comme phpBB. Mais dans votre page à vous, un CAPTCHA personnalisé est un excellent moyen de défense.

Les services de CAPTCHA
Actuellement, des services de CAPTCHA comme reCaptcha ou MSR's Asirra sont à la mode.
Mais, de par leur conception, ces solutions ne sont pas autonomes ; elles nécessitent que l'administrateur s'enregistre pour bénéficier du service. De plus, ces services reposent habituellement sur du code source en javascript. Sans compter qu'il subsiste le risque lié au fait que craquer ce type de service ouvrirait la porte à toutes les pages qui l'utilisent. Cet aspect doit d'ailleurs suffisamment motiver les spammers, pour qu'ils investissent les fonds nécessaires pour pouvoir craquer ces services, ce qui nous ramène encore une fois à notre situation actuelle. Toutefois, si vous cherchez une solution clef en main qui soit disponible immédiatement, afin d'empêcher les Bots de s'enregistrer chez vous, tout compte fait, de tels services s'avèrent très bien.

Question/Réponse (ou Q/R, pour : vo "Q&A"), Authentifi-chaton (ndt : vo "Kitten Auth"), etc.
Les questions les plus fréquentes, en ce qui concerne les CAPTCHAs, sont "Pourquoi n'utilisez- vous pas l'approche par Q/R ?" et "Qu'en est-il de Kitten Auth ?". L'approche par Q/R présume qu'une question non triviale est posée au moment de s'enregistrer, et que l'internaute va fournir une réponse répondant à certains critères. Les problèmes de cette approche sont multiples. Pour commencer, "google est ton ami !", aussi beaucoup de bonnes questions ne seront pas efficaces. Ensuite, le logiciel doit être capable de vérifier que la réponse fournie est correcte. Et la typo, comme écrire deux" au lieu de "2" ? Et l'internationalisation ? Et comment faire une fois qu'un Bot a trouvé une réponse correcte ? Et sur une question à choix multiple, comment empêcher le craquage par force brute ? ... et bien d'autres encore. La conclusion est certainement : cette approche n'est pas du tout un CAPTCHA, mais une épreuve dans laquelle les questions et les réponses sont limitées. D'ailleurs, n'importe quel ensemble de questions/réponses fourni avec un logiciel, téléchargeable qui plus est, serait craquer presque instantanément par les Bots.

Une tentative de contourner le problème de la langue est le Authentifi-chaton. Ce système d'authentification affiche à l'utilisateur un groupe d'images, qui correspondent à une question (elle montre des chatons). L'inconvénient est, comme pour le système de Q/R, que le nombre de questions est limité. Aussi, tout groupe d'images fourni avec le logiciel pourrait être hashé par les Bots, et donc, seul un jeu unique d'images pourrait constituer une barrière. De plus, même de simples déformations ne suffiraient pas à empêcher les algorithmes de craquer une identification à base d'images.

Ainsi, la réponse à toutes les questions au sujet des systèmes "Q/R" et "Authentifi-chaton" c'est : utilisez le si il vous convient ; mais il ne conviendrait pas si nous l'utiliserions.

Les CAPTCHAs audio
Parfois surgit une question demandant pourquoi il existe si peu de CAPTCHAs audio. Généralement la réponse est triple :
  1. l'internationalisation est quasiment impossible
  2. de nombreux internautes n'ont pas le son
  3. le bruit de fond nécessaire pour leurrer les algorithmes ... empêche aussi l'humain de résoudre le CAPTCHA

Les CAPTCHAs animés
De temps en temps, des tentatives apparaissent qui utilisent soit du flash soit du java pour afficher les CAPTCHAs. Le problème inhérent de cette approche, c'est que le CAPTCHA est affiché par le programme côté client, et qu'il doit donc connaître le code qui correspond. Les Bots ont alors juste à extraire cette graine, sans se soucier de la coque qui l'entoure, qu'elle soit en flash ou en java. Sans compter que cela requiert, pour l'utilisateur, d'avoir préalablement installé le moteur qui va bien, ce qui n'est pas non plus une bonne hypothèse de départ.

Les limitations
Les cours sur les CAPTCHAs traitent certainement de :
  • quelque soit le système de CAPTCHA, si il est incorporé dans une application majeure, il est d'office inutile
  • il existe toujours un spammer qui utilisera un humain pour passer un CAPTCHA
  • il existe toujours un humain qui se fera rejeté à tort par un CAPTCHA

Un petit CAPTCHA par Q/R pour phpBB3
L'implémentation v3.0 actuelle de CAPTCHA manque toutefois de possibilité de connexion, quelque chose qui devrait être fait pour lui permettre de fonctionner dans un temps fini. Toutefois, même ainsi, il est possible d'utiliser des classes de CAPTCHA différentes de celles fournies, sans avoir à adapter le code en dehors de la classe CAPTCHA.

Le code source qui suit correspond à un exemple de CAPTCHA par Q/R à la fois simple et à la fois facilement installable par remplacement du fichier captcha_gd. Ensuite vous devrez fournir une question en modifiant les entrées du langage, ainsi qu'un jeu d'images pour certaines adaptées à la question, pour d'autres inadaptées. Ces images utilisées doivent être enregistrées respectivement dans les dossiers, ou répertoires, "correct" et "incorrect".
Le code source est très simple mais n'atteint certes pas la qualité attendue pour un MOD, car il est simplement fourni comme exemple.

Code: Tout sélectionner
<?php
/**
*
* @package VC
* @version $Id: $
* @copyright (c) 2008 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
    exit;
}

class captcha
{
    var $width = 360;
    var $height = 96;

    /**
    * Create the image containing $code with a seed of $seed
    */
    function execute($code, $seed)
    {
        global $phpbb_root_path, $config;
        srand($seed);
        mt_srand($seed);

        // Create image
        $capt = new yes_no_captcha();
        init($code, $this->width, $this->height, $phpbb_root_path . 'images/captcha/smilies');
        $img = $capt->paint();

        // Send image
        header('Content-Type: image/png');
        header('Cache-control: no-cache, no-store');
        imagepng($img);
        imagedestroy($img);
    }

}

/**
* @package VC
*/
class yes_no_captcha
{
    var $letter_img = array();
    var $path;
    var $img;
    var $width = 0;
    var $height = 0;
    var $x_per_letter;

    /**
    * Init method
    * @param string $code The correct answer
    * @param int $width The number of pixels in the x direction
    * @param int $height The number of pixels in the y direction
    * @param string $path The path to load the images one. Needs to contain directories "correct" and "incorrect" with right respectively wrong pictures
    */
    function init($code, $width, $height, $path)
    {
        global $phpbb_root_path, $phpEx;

        $this->width = $width;
        $this->height = $height;
        $this->path = $path;

        $this->img = imagecreatetruecolor($this->width, $this->height);
        if (!function_exists('filelist'))
        {
            include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
        }
        $images = filelist($phpbb_root_path . $path);
        $code_len = strlen($code);
        $anticode_len = mt_rand($code_len - 1, $code_len + 1);
        $rand_str = md5(mt_rand(0, 2000000000));
        $rand_str = str_replace('0', 'Z', strtoupper(base_convert($rand_str, 16, 35)));
        $anticode = substr($rand_str, 0, $anticode_len);
        $codes = array(
            'correct' => $code,
            'incorrect' => $anticode,
        );

        $letters_correct = 0;
        $letters_incorrect = 0;
        while($letters_correct < strlen($codes['correct']) || $letters_incorrect < strlen($codes['incorrect']))
        {
            $which = ($letters_correct < strlen($codes['correct']) && $letters_incorrect < strlen($codes['incorrect']) ? mt_rand(0,1) : ($letters_correct letter_img[] = array(
                                'letter'        => $codes[$name][$i],
                                'image'            => $name . '/'. ($images[$name . '/'][mt_rand(0, count($images[$name . '/']) -1)]),
            );
        }

        $this->x_per_letter = floor($this->width / count($this->letter_img));
    }

    function paint()
    {
        $count = count($this->letter_img);
        for ($index = 0; $index write_letter($index);
        }
        return $this->img;
    }

    function write_letter($index)
    {
        $imgfile = $this->path . '/' . $this->letter_img[$index]['image'];
        $imagedata = getimagesize($imgfile);
        switch ($imagedata[2])
        {
            case 1 :
                    $img = imagecreatefromgif($imgfile);
                    break;

            case 2 :
                    $img = imagecreatefromjpeg($imgfile);
                    break;

            case 3 :
                    $img = imagecreatefrompng($imgfile);
                    break;

            default : return false;
        }
        $black = imagecolorallocate($this->img, 0, 0, 0);
        $img_rot = imagerotate($img, mt_rand(0, 30) - 15, $black);
        $position_x = $this->x_per_letter * $index;

        $color = imagecolorallocate($img_rot, 0, 10, 245);
        imagecopyresized($this->img, $img_rot, $position_x, 0, 0, 0, $this->x_per_letter, $this->height / 2, imagesx($img_rot), imagesy($img_rot));
        imagestring($this->img, 5, $position_x + mt_rand(5,10), $this->height / 2 + mt_rand(5,10), $this->letter_img[$index]['letter'], $color);
        imagedestroy($img);
        imagedestroy($img_rot);
    }
}

?>
captcha_gd


Voici un exemple avec les émoticones de la v3.0 pour la classe utilisée dans "Enter the letters underneath smiling emoticons", ce qui en soit est une idée très très mauvaise idée aussi ne le faites pas pour votre site.

Image
Lesquels sont souriants, narquois, rigolards ?

Et quoi d'autre dans le futur ? Nous verrons bien :D

Avatar de l’utilisateur
EricSchreiner
Traducteur
Traducteur
 
Rédigé le: 28 Oct 2008 à 19:04
Articles: 6
Noter cet article: 123456 Votants: Aucun
Mots-clés: CAPTCHAs, phpBB, CAPTCHA, bot, bots, enregistrement, spam, 30x

Retourner vers Utilisation de phpBB


cron