[PHP] Insertion d'un captcha

Résolu/Fermé
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 - 17 oct. 2009 à 19:35
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 - 22 oct. 2009 à 17:59
Bonjour,

J'ai lu précedemment sur un tuto que je ne retrouve malheureusement plus que l'on pouvait insérer un captcha de la manière suivante :

On insère le script de la réalisation/mémorisation du captcha comme on insèrerait une image en html...
Voici mes scripts:

script page 1
[...]
<span class="etape">3. Recopie maintenant le code de vérification ci-dessous :</span><br />
<img src="w.captcha.php" alt="captcha" /> <input type="text" name="verif" size="10" maxlength="5" /><br/>
[...]

script page 2
<?php
// CREATION & MEMORISATION du CAPTCHA :
session_start();
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$code = '';
while(strlen($code) != 6) {$code. = $liste[rand(0,36)];}
$_SESSION['code'] = $code;

// CREATION de l'IMAGE :
$img = imageCreate(70, 20) or die ("Une erreur s'est produite lors de la création de l'image. Recommence");
$background_color = imagecolorallocate ($img, 238, 238, 238);
$ecriture_color = imagecolorallocate ($img, 0, 0, 0);
$code_police = 5;

// FILTRE du CACHE des navigateurs :
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header("Content-type: image/jpeg");

// INSERTION du CAPTCHA dans l'IMAGE :
imageString($img, $code_police,(70-imageFontWidth($code_police) * strlen(''.$code.''))/2,0, $code,$ecriture_color);
imagejpeg($img,'',30); // qualité

// LIBÉRATION de la MÉMOIRE :
imageDestroy($img);
?>

Mais lorsque je vais sur la page 1, le captcha ne se présente pas ! (j'ai à la place la valeur du "alt") :(

Où est l'erreur ?
A voir également:

22 réponses

P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
21 oct. 2009 à 19:53
Enlève l'include de ton image ;)
2
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
18 oct. 2009 à 20:06
Accède directement à l'url de ton image dans ton navigateur.

En ajoutant une condition avant d'envoyer tes headers.

if( !headers_sent() )
{
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    header("Content-type: image/jpeg"); 
}


A vue de nez, je dirais que ça vient de imagestring().
1
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
18 oct. 2009 à 20:30
Salut,

Oui, c'est ça, ça permet de ne pas envoyer le content-type si une sortie texte a déjà été faites, donc pour visualiser l'erreur.

J'ai du faire un copié coller de ta ligne pour voir que tu avais mit un espace entre le . et le = de ta concaténation, il n'en faut pas.

Sinon, pour générer plus facilement ta chaine, tu peux utiliser str_shuffle() et substr() ;)
1
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
19 oct. 2009 à 19:39
Pour la notice, logique, tu n'as que 35 caractères dans ta chaine, donc 0,34.

Pour la seconde, GD n'est pas installé ou activé sur ton serveur, tout du moins je ne vois que ça.
1

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

Posez votre question
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
20 oct. 2009 à 21:46
Tu as mis du html dans ton code.

Comme je te l'ai indiqué précédemment, tu ne dois n'envoyer rien d'autres que ton image, donc tu ne gardes que ce qu'il y a entre <?php et ?> et tu vires le reste.

Et déplace les headers en les plaçant juste avant le imagejpeg.
1
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
18 oct. 2009 à 19:54
-ceci est un back up -
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
18 oct. 2009 à 20:14
Salut P@t@ch0n
Tout d'abord, merci de ta réponse, mais excuse-moi je n'ai pas du bien comprendre car c'est toujours faux...
-> Ton code, je le met bien à la place de :

// FILTRE du CACHE des navigateurs :
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header("Content-type: image/jpeg");

P.S: Mon localhost m'indique une 'parse error' dans la page de création de mon captcha à dans ' {$code. = $liste [rand (0,36)];} ' .
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
19 oct. 2009 à 19:18
Cool, y'a plus l'erreur...
Mais maintenant c'est ça qui s'affiche :

Notice: Uninitialized string offset: 35 in ... (désignant toujours {$code.= $liste [rand (0,36)];} )

Fatal error: Call to undefined function imageCreate() in...(désignant : $img = imageCreate(70, 20) or die ('...'); )

? ! ? !
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
19 oct. 2009 à 20:25
Mais alors comment faire pour réaliser une bonne notice ? (Celle-ci est tirée du tuto sans avoir été changée)
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
19 oct. 2009 à 20:57
Je n'ai pas compris ce que tu dis.

Réaliser une notice de quoi ?
0
graffx Messages postés 6506 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 24 mars 2019 1 973
19 oct. 2009 à 21:02
Les captcha sont bien sympas mais tres dur a mettre en place pour les debutants.

Je peux te conseiller une alternative simple.

Créer une question sur une image, une question ne comportement pas de mot universel.

Par exemple:

Quel est le chef de l' etat de notre pays?

et non pas:

Quel est le president de la france?

En effet, president est utilisé dans beaucoup de langue et donc compréhensible, et "france", forcement aussi.

Non seulement tu eviteras aussi bien les bots (puisque ca sera une image) mais aussi les etrangers venus spammer ton forum de lien moisis.

C' est une methode facile, juste au cas ou.
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
20 oct. 2009 à 12:47
merci de ton conseil, j'y penserai si vraiment je galère...
Mais je sens que je suis proche du but : les erreurs ont toutes disparues ! =)

Il ne manque plus qu'à savoir pourquoi, sur mon localhost, lorsque je vais sur la page de mon captcha ou de mon formulaire, ce n'est pas la page ni une erreur qui s'affiche, mais ' http://localhost/Mon%20site/Monsite/w.captcha.php ' ?!
P.S: J'ai actualisé mes pages du formulaires et du captcha sur mon client ftp, et voici ce qui s'affiche lorsque je vais sur la page du formulaire maintenant ! :
'ÿØÿà�JFIF������ÿþ�;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 30 ÿÛ�C� [...] (B+(%%(Q:=0B`Ued_U][jx™jqs[]…µ†ž£«­«g€¼Éº¦Ç™¨«¤ÿÛ�C(#(N++N¤n]n¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ÿÀ���Q@ÿÙ '

(ça s'affiche comme une erreur, en haut de la page...)
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
20 oct. 2009 à 19:34
C'est parce que tu dois faire un echo de ton image au lieu de mettre l'url dans l'attribut src de img.

Comme ta sortie dans ta page de ton formulaire n'est pas en jpeg mais en html, il est normal d'obtenir ceci.
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
20 oct. 2009 à 20:37
pourtant, dans le tuto, il est écrit qu'il est justement possible de faire cela ?!

Mais je n'ai pas compris ce que tu dis de faire :
j'ai essayé avec
<?php echo '$img' ?> (alors même résultat qu'avant et y'a afficher "$img" au lieu du "alt=" de "<img.../>")
<?php echo 'w.captcha.php' ?> (alors même résultat qu'avant)
<?php include('w.captcha.php') ?> (toujours comme avant mais ce script d'image est réaffiché au lieu du "alt=")
toujours à la place de <img src="w.captcha.php" alt="captcha" />

aucune de ces solutions n'est bonne =\
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
20 oct. 2009 à 20:53
Dans quel tuto ?

Non, ce n'est pas possible, soit tu envois du html, soit tu envois une image, les deux en même temps n'a pas de sens.Comme on dit, on ne mélange pas les torchons et les serviettes.

La bonne solution est donc bien.

<img src="w.captcha.php" alt="captcha" /> 


Si tu n'obtiens toujours pas ton image, c'est que tu as toujours des erreurs dans celle-ci.
Donc même méthode que précédemment pour débuguer, accéde directement à l'image dans ton navigateur.
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
20 oct. 2009 à 21:14
"C'est parce que tu dois faire un echo de ton image au lieu de mettre l'url dans l'attribut src de img "
-> Où et Comment utiliser l'echo ?

" La bonne solution est donc bien. <img src="w.captcha.php" alt="captcha" /> "
-> C'est ce que j'avais fait =)

"Dans quel tuto ?"
-> Je ne le retrouve plus ! =\ (voir 1er post)

Donc comment afficher le captcha ?

P.S: Lorsque je vais directement sur la page de réalisation du captcha, les symboles du script de mon image s'affichent sur une page blanche.
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
20 oct. 2009 à 21:21
Hum, en effet ma phrase était ambigüe, quand je disais « tu dois faire », cela était dans le sens « tu as du faire ».

Il ne faut pas faire d'echo de l'image, mais bien mettre l'url de celle-ci dans la balise img.

Tu peux remontrer ton code de l'image ?
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
20 oct. 2009 à 21:26
ah ok ! il y avait un malentendu =)

Voici mon script:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<body>

<?php
// CREATION & MEMORISATION du CAPTCHA :
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$code = '';
while (strlen($code) != 6)
{$code.= $liste [rand (0,34)];}
$_SESSION['code'] = $code;

// CREATION de l'IMAGE :
$img = imageCreate(70, 20) or die ("Une erreur s'est produite lors de la création de l'image. Recommence");
$background_color = imagecolorallocate ($img, 238, 238, 238);
$ecriture_color = imagecolorallocate ($img, 0, 0, 0);
$code_police = 5;

// FILTRE du CACHE des navigateurs :
if( !headers_sent() )
{
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header("Content-type: image/jpeg");
}

// INSERTION du CAPTCHA dans l'IMAGE :
imageString($img, $code_police,(70-imageFontWidth($code_police) * strlen(''.$code.''))/2,0, $code,$ecriture_color);
imagejpeg($img,'',30); // qualité

// LIBÉRATION de la MÉMOIRE :
imageDestroy($img);
?>

</body>
0
digival Messages postés 193 Date d'inscription mercredi 14 octobre 2009 Statut Membre Dernière intervention 7 novembre 2010 1
21 oct. 2009 à 19:03
Cool, ça marche ! =)

Seulement j'ai toujours les symboles du script de l'image en haut de la page du formulaire...
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
21 oct. 2009 à 19:13
Montre le code de la page du formulaire.
0