jump to navigation

[PHP] Générateur de documentation 11 août 2009

Posted by Nassim in Développement.
Tags: , , , , , , , , ,
2 comments

Pour diverses raisons un programmeur doit rédiger une documentation pour ses applications, cette tâche peut s’avérer très fastidieuse et rébarbative.

Étant actuellement en stage, je n’échappe pas à cette obligation de fournir une documentation technique qui servira les gens qui s’occuperont du maintient de l’application après mon départ, d’autant plus que mon travail s’inscrit dans un cadre OpenSource.

A l’université j’ai principalement appris à développer en JAVA, ce langage a la particularité d’intégrer par défaut un générateur de documentation nommé Javadoc, il est simple d’utilisation et donne un bon résultat. Par contre, sous PHP il n’y a pas de générateur de documentation inclus par défaut, j’ai donc comparé les différents outils disponibles sur la toile et mon choix c’est très vite porté vers Doxygen qui permet de générer de la documentation pour des programmes en PHP mais aussi des programmes en C/C++, JAVA, C#, Python,…etc.

Un des avantages non négligeables en ce qui me concerne est la possibilité d’utiliser avec Doxygen la même syntaxe que celle de Javadoc, ce qui est fort agréable quand on est déjà habitué à cet outil. Il y a aussi d’autres avantages comme : support de divers formats de sortie (PDF, XML, HTML…etc), templates personnalisables, tags personnalisables…etc.

Doxygen est donc un outil que je vous conseille fortement, je n’ai pas encore étudié le cas de Python mais si celui-ci ne dispose pas d’un outil standard,  j’utiliserai surement Doxygen pour la documentation de la partie Python de mon projet.

Site officiel : http://www.stack.nl/~dimitri/doxygen/index.html

[PHP-Sécurité] Technique du grain de sel 10 août 2009

Posted by Nassim in Développement, Sécurité.
Tags: , , , , , , , ,
2 comments

Intrigant comme titre non ? La technique du grain de sel est une méthode permettant de renforcer les hash MD5 des mots de passe d’une application, elle n’est pas spécifique à PHP et peut être adapté à bien des langages.

Le fonctionnement de cette technique est très simple, il conciste à concaténer une chaine au mot de passe avant de le hasher en MD5, cette chaine étant composée de caractères aléatoires de préférence. Le but de cette manoeuvre? Tout simplement rallonger le mot de passe et rendre les attaques par brute-force et par rainbow tables plus difficiles pour ne pas dire impossibles.

En effet, avec des attaques par rainbow tables (tables arc-en-ciel en français) il est souvent possible de casser un mot de passe de 8 lettres et moins, sachant qu’il est rare qu’un utilisateur ait un mot de passe d’une longueur supérieur, les chances de réussite sont relativement élevées.

A l’aide d’un grain de sel, on va résoudre ce problème de longueur de mot de passe et rendre les attaques de décryptage beaucoup plus fastidieuses. Voyons un peu en pratique comment implémenter notre méthode :

$salt = “aJ!#eIL-pwZm*F”;  // Notre grain de sel, une chaine de caractères

$password = $_POST['password'];  // Le mot de passe saisie par l’utilisateur via le formulaire d’enregistrement

$password = md5($password.$salt);  // On effectue une concaténation du mot de passe avec notre grain de sel

Voilà… c’est aussi simple que ça ! Il ne reste plus qu’à sauvegarder le mot de passe dans la base de données, bien entendu, pour vérifier le mot de passe de l’utilisateur quand il voudra s’identifier il ne faudra pas oublier de concaténer à nouveau le mot de passe saisie avec le grain de sel.

Lorsqu’on dévelope une application qui sera redistribuée avec sa source, on ne peut pas implémenter la technique du grain de sable directement comme on l’a fait plus haut, pour la simple raison que le “salt” sera visible par tous dans le code source, il y a 2 solutions que je connais pour y remédier :

1/ Soit vous demandez explicitement aux utilisateurs de votre application d’éditer la source pour modifier la valeur du salt.

2/ Soit vous concevez une fonction qui générera un salt et qui sauvegardera sa valeur dans la base de données, votre application pourra ainsi obtenir la valeur du salt dès qu’elle en a besoin en intérrogant la BD. C’est cette technique qui est par exemple employée par Joomla, à la différence qu’il y a un grain de sel généré pour chaque utilisateur.

Personnellement, si vous développez une application pour votre propre besoin, préférez la première façon de faire car elle présente l’avantage d’être moins gourmande en ressource (pas de fonction de génération avec des random, ni de requêtes SQL) et elle n’est pas vulnérable aux injections SQL.

Voilà… j’espère vous avoir présenter une fois de plus un article instructif et simple. N’hésitez pas à laisser des commentaires et à proposer des solutions alternatives.

[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 ;-)