Bonjour,

J'ai un petit problème pour la mise en place d'un captcha.

J'ai un fichier captcha.php qui crée une image et un code qu'il place dans un variable $code.

Une fois la variable $code créée, je la transmets à une variable $_SESSION['captcha'] pour pouvoir l'utiliser dans mon formulaire.

Seulement voilà, si $code contient bien le code créé, la variable $_SESSION est toujours égale à "".

J'ai dû faire une erreur quelque part mais je n'arrive pas à la trouver.

Voici mon fichier captcha.php, placé à la racine de mon site.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
session_start();
 
/* ================
 *  INITIALISATION
 * ================ */
 
// Chemin absolu vers le dossier
if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');
 
/* =======================
 *  FONCTIONS UTILITAIRES
 * ======================= */
 
 /**
 * Fonction qui génère une chaîne de caractères aléatoires.
 * - 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 chaîne $chars, $chars{1} le deuxième ...
 *
 * @param $length La taille souhaitée pour le code
 * @return Le code à recopier par l'utilisateur
 */
 
function getCode($length) {
    $chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // Certains caractères ont été enlevés car ils prêtent à confusion
    $code = '';
    // On prend $length fois un caractère de $chars au hasard
    for ($i=0; $i<$length; $i++) {
        $code .= $chars{ mt_rand( 0, strlen($chars) - 1 ) };
    }
    return $code; // Le code, par exemple : R5AQJ
}
 
/* ==========================
 *  STOCKAGE DU HASH DU CODE
 * ========================== */
 
// Stockage de la chaîne aléatoire de 5 caractères obtenue
$code = getCode(5);
 
// stockage dans la variable de session $_SESSION['captcha'].
$_SESSION['captcha'] = $code;
 
/**
 * Fonction qui retourne une valeur aléatoire du tableau reçu en paramètre.
 * On l'utilise pour générer aléatoirement la couleur et la police de caratères
 *
 * @param Le tableau dont on extrait une valeur au hasard
 */
function random($tab) {
    return $tab[array_rand($tab)];
}
/* =======================
 *  TRAITEMENT DE L'IMAGE
 * ======================= */
 
// Afin de traiter les caractères séparément, on les stocke un par un dans des variables.
$char1 = substr($code,0,1);
$char2 = substr($code,1,1);
$char3 = substr($code,2,1);
$char4 = substr($code,3,1);
$char5 = substr($code,4,1);
// glob() retourne un tableau répertoriant les fichiers du dossier 'fonts', ayant l'extension .ttf ( pas .TTF ! ).
// Vous pouvez donc ajouter autant de polices TrueType que vous désirez, en veillant à les renommer.
$fonts = glob('fonts/*.ttf');
 
// imagecreatefrompng() crée une image dynamique à partir d'un fichier PNG statique.
// Cela permet d'écrire sur l'image via PHP
$image = imagecreatefrompng('captcha.png');
 
// 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, 131, 154, 255),
                  imagecolorallocate($image,  89, 186, 255),
                  imagecolorallocate($image, 155, 190, 214),
                  imagecolorallocate($image, 255, 128, 234),
                  imagecolorallocate($image, 255, 123, 123) );
 
// imagettftext(image, taille police, inclinaison, coordonnée X, coordonnée Y, couleur, police, texte) écrit le texte sur l'image.
// Mise en forme de chacun des caractères et placement sur l'image.
imagettftext($image, 28, -10, 0, 37, random($colors), ABSPATH .'/'. random($fonts), $char1);
imagettftext($image, 28, 20, 37, 37, random($colors), ABSPATH .'/'. random($fonts), $char2);
imagettftext($image, 28, -35, 55, 37, random($colors), ABSPATH .'/'. random($fonts), $char3);
imagettftext($image, 28, 25, 100, 37, random($colors), ABSPATH .'/'. random($fonts), $char4);
imagettftext($image, 28, -15, 120, 37, random($colors), ABSPATH .'/'. random($fonts), $char5);
 
/* =========================
 *  FIN -> ENVOI DE L'IMAGE
 * ========================= */
 
// C'est le fichier dynamique captcha.php et non captcha.png qui est appelé pour afficher l'image,
// on envoie donc un en-tête HTTP au navigateur via header() pour qu'il considère
// que captcha.php est une image de type 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);
?>
Et voici le formulaire que j'utilise :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
<form action="registerok.html" method="post" class="ajax_form" name="contactForm">
<div class="row alignleft">                              
                                    <!-- Image dynamique -->
                                    <p><img src="captcha.php" alt="Captcha" id="captcha" />
                                    <!-- (JavaScript) Recharge l'image car elle n'existe pas dans le cache du navigateur, grâce à l'id généré  -->
                                    <img src="reload.png" alt="Recharger l'image" title="Recharger l'image" style="cursor:pointer;position:relative;top:-7px;" onclick="document.images.captcha.src='captcha.php?id='+Math.round(Math.random(0)*1000)" /></p>
                                    <label><strong>Recopie le code ci-dessus :</strong></label>
                                    <input type="text" id="captcha" name="captcha" value="<?php echo $_SESSION['captcha'] ?>" class="inputtext input_middle required" />
                                </div>
</form>