jump to navigation

[PHP] Création d’un captcha 29 juillet 2009

Posted by Nassim in Développement, Mes créations.
Tags: , , , , , , , , ,
8 comments

L’idée de ce billet ne m’est pas venue par hasard, elle provient tout simplement de mon stage puisque j’ai été amené à concevoir un captcha pour l’application web que je développe actuellement.

Sans vouloir exagérer, vous allez voir qu’on peut concevoir un captcha performant sans que cela soit compliqué ni long. Pour comprendre ce que j’explique plus bas il vous faut connaitre les rudiments de base en PHP, comme les sessions.

  1. Le principe de fonctionnement :
  2. Avant de commencer à coder j’aimerais vous expliquer le principe de fonctionnement de notre captcha histoire que vous compreniez mieux ce qu’on est entrain de faire.

    Normalement vous devez savoir que le PHP permet de générer du code HTML qui sera affiché par votre navigateur, ce que vous ne savez peut être pas est qu’il peut aussi générer d’autres types de fichiers comme une image. C’est cette dernière spécificité que nous allons exploiter. En effet, nous allons dans notre formulaire à l’emplacement de notre captcha insérer une balise image qui pointera vers notre script PHP, ce script PHP devra donc être capable de générer en sortie l’image qui sera affichée pour le captcha, pour comparer la valeur du texte de l’image et du texte saisie par l’utilisateur nous allons utiliser un système de sessions… vous n’avez peut être pas trop compris mes explications mais passons tout de suite à la pratique ;-)

  3. Pré-requis :
  4. Avant de commencer il va nous falloir préparer le terrain, pour cela :

    - Il faut installer la bibliothèque GD de PHP, pour cela il faut éditer votre fichier ‘php.ini’.

    - Il vous faut préparer l’image de fond du captcha au format PNG, nommez-la par exemple ‘captcha.png’.

    - Il vous faut préparer la police d’écriture (au format TTF) utilisée pour le texte du captcha.

  5. Le script PHP :
  6. Voici donc le code de notre partie PHP :

    <?php
    /* Script Captcha – Nassim Kacha – http://lebricabrac.wordpress.com */

    /* Note :
    - Il faut installer la bibliothèque GD de PHP (voir dans ‘php.ini’).

    - Notre captcha sera insensible à la case.
    */

    session_start(); // Ouverture de session

    /* Fonction qui génère le code du captcha */
    function getCode($longueur) {
    $caracteres = ‘23456789ABCDEFGHJKLMNPQRSTUVWXYZ’; // Jeu de caractères utilisé pour générer le code du captcha.
    $code = ”; // Initialisation d’une chaine vide
    for ($i=0; $i<$longueur; $i++) {
    $code .= $caracteres{ mt_rand( 0, strlen($caracteres)-1 ) };
    }
    return $code;
    }

    /* Génération d’un code de 5 caractères */
    $code = getCode(5); // valeur modifiable

    /* Stockage de la valeur du captcha */
    $_SESSION['captcha'] = md5($code);

    /* Récupération de chacun des caractères pour l’affichage du captcha */
    $char1 = substr($code,0,1);
    $char2 = substr($code,1,1);
    $char3 = substr($code,2,1);
    $char4 = substr($code,3,1);
    $char5 = substr($code,4,1);

    /* Police d’éciture */
    $font = “BeeMarkerInk.ttf”; // A modifier selon votre fichier ttf

    /* Création de l’image du captcha */
    $image = imagecreatefrompng(‘captcha.png’);

    /* Création de la couleur du code */
    $couleur = imagecolorallocate($image, 255,0,0); // Noir, peut être modifié

    /* Insertion du code dans le captcha */
    imagettftext($image, 28, 0, 0, 37, $couleur, $font, $char1);
    imagettftext($image, 28, 25, 30, 37, $couleur, $font, $char2);
    imagettftext($image, 28, 0, 50, 37, $couleur, $font, $char3);
    imagettftext($image, 28, 25, 80, 37, $couleur, $font, $char4);
    imagettftext($image, 28, -15, 90, 37, $couleur, $font, $char5);

    /* Header pour indiquer au browser qu’il s’agit d’une image PNG */
    header(‘Content-Type: image/png’);

    /* Envoie de l’image au browser */
    imagepng($image);

    /* Destruction de l’image après envoi pour optimiser l’utilisation de la mémoire */
    imagedestroy($image);
    ?>

  7. Le formulaire :

Maintenant nous allons concevoir notre fomulaire, bien entendu libre à vous de le personnaliser par la suite.

<?php

session_start(); // Ouverture d’une session

?>

<html>

<head>

<title>Mon formulaire</title>

</head>

<body>

<form method=”post” action=”#”>
Votre email : <input type=”text” name=”email” id=”email” />
<br />
Mot de passe* : <input type=”text” name=”password” id=”password” />
<br />
Nom : <input type=”text” name=”nom” id=”nom” />
<br />
Prénom : <input type=”text” name=”prenom” id=”prenom” />
<br />
Veuillez recopier le texte de l’image :
<br />
<img src=”captcha/captcha.php” alt=”captcha” />

&nbsp;
<input type=”text” name=”captcha” id=”captcha” maxlength=”5″ size=”5″/>

<input type=”submit” value=”S’inscrire” />

</from>

<?php

if (isset($_POST['captcha']))  // Si le champ captcha a été rempli

{

if (md5(strtoupper($POST['captcha']))  != $_SESSION['captcha'])  {

echo ‘<script>alert(“Veuillez recopier le code  correctement”);</script>’;

}

else {

/* Votre traitement de formulaire */

}

?>

</body>

</html>

Voilà, maintenant notre captcha est opérationnelle et permet d’éviter le spam. Cela dit, il est possible d’améliorer notre système en utilisant plusieurs polices d’éciture en même temps et en variant les couleurs de chacune des lettres, pour cela il suffit d’utiliser un tableau et une fonction random… rien de très compliqué pour ceux qui ont déjà une base en PHP. Une astuce aussi que j’aime bien et qui rend la tache des bots plus compliquée et d’entre croiser les lettres, pour cela il faut jouer avec les valeurs de la fonction ‘imagettftext’.

Voilà… à vos clavier maintenant ;-)

Joomla Password Reset 10 juillet 2009

Posted by Nassim in Mes créations.
Tags: , , , , , , , , , , , , , ,
5 comments

Joomla est un CMS très connu et beaucoup utilisé sur la toile, si vous possédez vous même un site dynamique il est fort possible que vous soyez déjà utilisateur de cette application… et si vous êtes du genre brouillon ou tête en l’air, il est fort possible que vous ayez oublié ou perdu votre mot de passe administrateur.

Si cela vous est arrivé, vous avez probablement eu l’idée d’accéder à votre base de données via PhpMyAdmin pour y modifier directement votre mot de passe (une sorte de réinitialisation). Cette méthode marche très bien… enfin… sauf si vous utilisez Joomla 1.5 car depuis cette version il semblerait que les mots de passe stockés dans la base de données de Joomla soient couplés avec une clé générée aléatoirement.

Ainsi, si vous regardez l’attribut “password” de la table “jos_users” de Joomla (le préfixe jos pouvant varier), vous remarquerez que le mot de passe stocké est du style (ce n’est qu’un exemple) : ab4f63f9ac65152575886860dde480a1:0a5b3913cbc9a909

Il n’est donc pas possible de remplacer directement ce contenu par le hash MD5 du nouveau mot de passe que vous aimeriez mettre en place. Néanmoins, en étudiant le code de Joomla j’ai pu comprendre le fonctionnement de ce couple hash MD5:clé, cela ne m’a pas été compliqué de concevoir une application permettant de crypter de la même façon un nouveau mot de passe.

Ce petit logiciel que j’ai nommé Joomla Password Reset permet donc de crypter un mot de passe à la façon de Joomla dans le but de remplacer sa valeur directement dans la BD, cela permet de faire une réinitialisation en cas de perte, les plus vicieux auront compris que c’est aussi exploitable pour pirater un site à base de Joomla quand on a accès à la base de données (Je décline, d’ailleurs, toute responsabilité quant à l’utilisation de mon logiciel) .

JPR (Joomla Password Reset) est codé en Python, il vous faudra donc posséder l’interpréteur Python sur votre machine (Linux ou Windows) pour pouvoir l’exécuter, je tâcherai de mettre au point un exécutable “.exe” pour les utilisateurs de Windows (les moins débrouillards quoi !).

La version actuelle est une bêta mais elle est totalement fonctionnelle, j’attends d’ajouter une fonction de modification immédiate de la BD pour publier le logiciel en version 1, et par la même occasion, transmettre ses sources.

Liens de téléchargement :

http://www.zshare.net/download/62489772a0664847/

http://www.megaupload.com/?d=NQ5XQ5VY

Pour lancer l’application sous Linux :

python jpr.pyc

Veuillez utiliser cette application dans un cadre légal uniquement !!!