Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 2015
-
14 août 2007 à 21:09
cs_aroh
Messages postés16Date d'inscriptiondimanche 13 juillet 2003StatutMembreDernière intervention17 octobre 2007
-
17 août 2007 à 11:43
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 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>
<?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 'Le code ne correspond pas, réessayez !
';
// sinon le code est exact
else echo 'Le code est exact !
';
}
?>
<!-- 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 -->
<label for="Verification">Recopiez le code ci-dessus</label>
Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 20152 14 août 2007 à 21:26
Je voulais juste rajouter que la font ne s'affiche jamais malgré le fait que j'ai mis sur le serveur des fichiers.ttf. J'ai également essayé cette solution ci-dessous mais l'image ne s'affiche pas dans le formulaire, j'ai juste un carré avec une croix rouge. Si quelqu'un peut m'aider à comprendre ce qui foire ça serait bien .
Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 20152 16 août 2007 à 19:52
Salut,
Désolé pour le poste précédent vide, j'ai un petit soucis avec mon navigateur IE, c'est vraiment de la daube, vive firefox. Bref, j'ai essayé de changer de place le header juste avant le imagepng($image), j'ai pas d'erreur mais tjs pas d'image qui s'affiche. Est ce que ça peut venir mon hebergeur?
Au sinon, je vais essayer ton script pysco68, histoire de voir si ça marche chez mon herbergeur.
Merci pour votre aide.
@+