Demande aide pour mon script captcha

Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 - 14 août 2007 à 21:09
cs_aroh Messages postés 16 Date d'inscription dimanche 13 juillet 2003 Statut Membre Dernière intervention 17 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>
 

 
 

 
  </form>
 
  </html>
 

Jarod_Delaware

6 réponses

Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
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 .

Mon autre test pour générer l'image :

session_start();

header("Content-Type: image/jpeg");
create_image();
die();

function create_image()
{
    $md5 = md5(rand(0,9999));
    $pass = substr($md5, 10, 5);
   
    $_SESSION["pass"] = $pass;
   
    $image = ImageCreatetruecolor(100, 20); 

    $clr_white = ImageColorAllocate($image, 255, 255, 255);
    $clr_black = ImageColorAllocate($image, 0, 0, 0);

    imagefill($image, 0, 0, $clr_black);

    imagefontheight(15);
    imagefontwidth(15);

   imagestring($image, 5, 30, 3, $pass, $clr_white);
   
    imageline($image, 5, 1, 50, 20, $clr_white);
    imageline($image, 60, 1, 96, 20, $clr_white);

    imagejpeg($image);
   
   imagedestroy($image);
}
?>

Jarod_Delaware
0
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
15 août 2007 à 12:03
jette un coup d'oeil ma source.... sur mon serveur elle marche... compare avec ce que tu fais....

Developpement Web Yannic GraphiX | Mon CMS yArt et sa démo
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
15 août 2007 à 12:17
Salut

t'as aucun message d'erreur ?

vire le header, et met le juste avant le  imagepng($image); ca te permetra de verifier si tu as une erreur ou non

<hr />une recherche sur exalead vous aurait peut-etre evite de poser cette question

In a dream, I saw me, drop dead...
U were there, U cried...
It was just a dream,
if I die, U won't cry, maybe, U'll be happy
0
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
16 août 2007 à 10:47
Jarod_Delaware
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jarod1980 Messages postés 273 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 31 mars 2015 2
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.
@+

Jarod_Delaware
0
cs_aroh Messages postés 16 Date d'inscription dimanche 13 juillet 2003 Statut Membre Dernière intervention 17 octobre 2007
17 août 2007 à 11:43
hello,
chez moi ça marche pas le code suivant: ça ne ressort que du rouge à chaque fois
$colors

= array
(
imagecolorallocate
($im
,
255,0,0),
// rouge
imagecolorallocate
($im
,
109,30,100),
// violet
imagecolorallocate
($im
,
30,80,180),
// bleu
imagecolorallocate
($im
,
40,100,20),
// vert
imagecolorallocate
($im
,
255,90,0),
// orange
imagecolorallocate
($im
,
130,130,130));
// gris

functionaleatoire
($tab
){
$max
=count
($tab
)-1;
$hasard
= mt_rand
(0,$max
);

return
($tab
[$hasard
]);

}

$couleur_fond
=aleatoire
($colors
);
0
Rejoignez-nous