Bonjour,
J'ai essayé de mettre en place une methode de
captcha mais mon image aléatoire ne s'affiche jamais dans ma page
formulaire que ce soit avec IE ou Firefox, j'ai vérifié si la librairie GD est activée sur mon serveur
en faisant un phpinfo() et c'est le cas. Est ce que quelqu'un pourrait
m'aider à résoudre ce problème, svp?
Je mets mes 2 fichiers php ci-dessous.
Merci.
Mon fichier image.php :
<?php
// On démarre une session
session_start();
/*
Pour créer une image, on envoie un en-tête avec la fonction header()
pour dire au navigateur qu'on envoie une image
Lorsqu'on va appeler l'image avec <img src="..." /> on utlisera
bien image.php et non bruit.png
*/
header("Content-Type: image/png");
/**
mt_rand() génère un nombre aléatoire : cette fonction est
plus rapide que rand() de la bibliothèque standard
sha1() renvoie une chaine cryptée de son paramètre. Elle est similaire
à md5() mais renvoie une chaine plus longue, la probabilité de
collision est donc réduite
substr() retourne le segement d'une chaine. Dans notre cas on prend un segment
de 5 caractères en partant du caractère 0
On stocke alors la chaine obtenue dans $rand_str
*/
$rand_str = substr( sha1( mt_rand() ), 0, 5);
// On hash ensuite cette valeur avec md5() puis on stocke ce résultat dans variable de session $_SESSION['valeur_image'] de la session en cours
$_SESSION['valeur_image'] = md5($rand_str);
// Afin de personnaliser chacun de nos caractères, on les stocke un par un dans des variables
$char1=substr($rand_str,0,1);
$char2=substr($rand_str,1,1);
$char3=substr($rand_str,2,1);
$char4=substr($rand_str,3,1);
$char5=substr($rand_str,4,1);
/*
imagecreatefrompng() crée une nouvelle image PNG à partir d'un
fichier
On la stocke dans $image pour pouvoir y mettre ensuite nos caractères
*/
$image=imagecreatefrompng("bruit.png");
/*
putenv() fixe la valeur de la variable d'environnement pour GD. Cette valeur
n'existera que durant la vie du script courant, et l'environnement initial sera
restauré lorsque le script sera terminé
Cette ligne est utile si vous avez des problèmes lorsque la police de
caractère réside dans le même dossier que le script qui
l'utilise
Remarquez que lorsqu'on utilisera les polices, il faudra enlever l'extension
.tff
*/
putenv('GDFONTPATH=' . realpath('.'));
/*
glob() retourne un tableau contenant les fichiers trouvés dans le dossier
avec l'extension .ttf
Vous pouvez donc ajouter autant de police TTF que vous voulez
*/
$files = glob("*.ttf");
/*
Pour chaque nom de fichier trouvé, on retire l'extension .tff
Et on l'ajoute au tableau $font[]
*/
foreach ($files as $filename) {
$filename = substr($filename,0,-4); // retire l'extension .tff
$fonts[] = $filename; // ajoute les noms des polices sans leur extension dans un tableau
}
/*
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, 255,0,0), // rouge
imagecolorallocate($image, 109,30,100), // violet
imagecolorallocate($image, 30,80,180), // bleu
imagecolorallocate($image, 40,100,20), // vert
imagecolorallocate($image, 255,90,0), // orange
imagecolorallocate($image, 130,130,130)); // gris
/*
On crée la fonction aleatoire() qui va retourner une valeur prise au hasard dans un tableau
Elle sera utilisée pour piocher une couleur et une police au hasard pour chaque caractère
*/
function aleatoire($tab){
$max = count($tab)-1;
$hasard = mt_rand(0,$max);
return ($tab[$hasard]);
}
/*
On met en forme nos caractères un par un pour les disposer sur notre
image d'origine bruit.png
imagettftext(image, taille_de_la_police, angle, coordonnée_X_à_partir_du_bord,
coordonnée_Y_à_partir_du_bord, couleur_RVB, police_de_caractères,
texte) dessine un texte avec une police TrueType
*/
imagettftext($image, 25, -10, 10, 35, aleatoire($colors), aleatoire($fonts), $char1);
imagettftext($image, 25, 20, 40, 35, aleatoire($colors), aleatoire($fonts), $char2);
imagettftext($image, 25, -35, 60, 35, aleatoire($colors), aleatoire($fonts), $char3);
imagettftext($image, 25, 25, 100, 35, aleatoire($colors), aleatoire($fonts), $char4);
imagettftext($image, 25, -15, 120, 35, aleatoire($colors), aleatoire($fonts), $char5);
// imagepng() crée une image PNG en utilisant l'image $image
imagepng($image);
//L'image a été créée, on appelle donc imagedestroy() qui libère toute la mémoire associée à l'image $image
imagedestroy($image);
?>
Mon fichier form.php :<?php
/** On démarre une session pour pouvoir récupérer le code généré */
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
/>
<title>Formulaire avec captcha</title>
</head>
<body>
<?php
/** Si le formulaire a été soumis */
if(isset($_POST['submit'])) {
$nombre = $_POST['nombre']; // on stocke dans $nombre la valeur tapée dans le formulaire
// si le code ne correspond pas à celui déjà stocké dans la variable de session après l'avoir hashé avec md5() comme l'autre
if(md5($nombre) != $_SESSION['valeur_image'])
// on affiche une erreur
echo '<h1>Le code ne correspond pas, réessayez !</h1>';
// sinon le code est exact
else echo '<h1>Le code est exact !</h1>';
}
?>
<!-- Formulaire $_SERVER['PHP_SELF'] signifie que le traitement du formulaire se fait sur la même page -->
<form name="verify_form" method="post" action="<?
$_SERVER['PHP_SELF'] ?>">
<!-- Affichage de l'image créée par image.php -->
<img src="image.php" alt="Captcha" id="captcha"/><br>
<br /><br />
<label for="Verification">Recopiez le code ci-dessus</label>
<br />
<input name="nombre" type="text" id="nombre">
<br />
<input type="submit" name="submit" value="Envoyer"/>
</form>
</body>
</html>
Jarod_Delaware