<?php
/* ////////////////////
INITIALISATION
//////////////////// */
/* Démarrage d'une session qui va nous permettre de stocker la valeur à recopier. */
session_start(); // session_start() se place toujours avant toute sortie vers la page web
/* Chemin absolu vers le dossier */
if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');
/*
Création d'une fonction pour générer la chaîne aléatoire à recopier (sans cryptage) :
- strlen() retourne la taille de la chaine en paramètre
- mt_rand(a, b) génère un nombre aléatoire entre a et b compris : cette fonction est plus rapide que rand() de la bibliothèque standard
- $chars{0} retourne le premier caractère de la chaine $chars, $chars{1} le deuxième ...
*/
function getCode($length) {
$chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // Certains caractères ont été enlevés car ils prêrtent à confusion
$rand_str = '';
for ($i=0; $i<$length; $i++) {
$rand_str .= $chars{ mt_rand( 0, strlen($chars)-1 ) };
}
return $rand_str;
}
/* Stockage de la chaine aléatoire de 5 caractères obtenue */
$theCode = getCode(5);
/* Cryptage de la chaine avec md5() avant de la stocker dans la variable de session $_SESSION['formesmagiques_captcha'] de la session en cours.
C'est à cette variable qu'on va comparer le code entré par l'utilsateur dans le formulaire. */
$_SESSION['formesmagiques-captcha'][$_REQUEST['sid']] = md5($theCode);
/* Afin de traiter les caractères séparément, on les stocke un par un dans des variables. */
$char1 = substr($theCode,0,1);
$char2 = substr($theCode,1,1);
$char3 = substr($theCode,2,1);
$char4 = substr($theCode,3,1);
$char5 = substr($theCode,4,1);
/*
glob() retourne un tableau répertoriant les fichiers du dossier 'fonts', ayant l'extension .ttf ou .TTF.
Vous pouvez donc ajouter autant de polices TrueType que vous désirez, en veillant à les renommer.
*/
$fonts = array();
if ($dh = opendir(ABSPATH .'fonts')) {
while ($file = readdir($dh)) {
if ($file == '.' || $file == '..') continue;
$fonts[] = ABSPATH ."fonts/$file";
}
@closedir($dh);
}
else {
die("Ne peut ouvrir le répertoire ".ABSPATH."fonts");
}
/* //////////////////////////////
TRAITEMENT DE L'IMAGE
////////////////////////////// */
/*
imagecreatefrompng() crée une nouvelle image à partir d'un fichier PNG.
Cette nouvelle $image va être ensuite modifiée avant l'affichage.
*/
$image_file = 'images/captcha.png';
$image = imagecreatefrompng($image_file);
if ($image == false) {
die("Ne peut ouvrir l'image $image_file");
}
/*
imagecolorallocate() retourne un identifiant de couleur.
On définit les couleurs RVB qu'on va utiliser pour nos polices et on les stocke dans le tableau $colors[].
Vous pouvez ajouter autant de couleurs que vous voulez.
*/
$colors=array ( imagecolorallocate($image, 0x80,0,0),
imagecolorallocate($image, 0,0x80,0),
imagecolorallocate($image, 0,0,0x80),
imagecolorallocate($image, 0x33,0x33,0x33),
imagecolorallocate($image, 0,0,0) );
/* Création d'une petite fonction qui retourne une VALEUR aléatoire du tableau reçu en paramètre. */
function random($tab) {
return $tab[array_rand($tab)];
}
/*
Mise en forme de chacun des caractères et placement sur l'image.
imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
*/
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 5, 23, random($colors), random($fonts), $char1);
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 18, 23, random($colors), random($fonts), $char2);
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 37, 23, random($colors), random($fonts), $char3);
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 62, 23, random($colors), random($fonts), $char4);
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 80, 23, random($colors), random($fonts), $char5);
/* //////////////////////////////
FIN => ENVOI DE L'IMAGE
////////////////////////////// */
/*
Comme c'est le fichier image.php et non captcha.png qui va être appelé,
on envoie un en-tête HTTP au navigateur via header() pour lui indiquer
que image.php est bien une image au format PNG.
*/
header('Content-Type: image/png');
/* .. et on envoie notre image PNG au navigateur. */
imagepng($image);
/* L'image ayant été envoyée, on libère toute la mémoire qui lui est associée via imagedestroy(). */
imagedestroy($image);
?>