Générer une image
<?php
// Démarage d'une session
session_start();
// création d'une chaine de caractères (faire attention à ne pas avoir d'éléments qui peuvent parraitre confus tels que 1,l,I,0,O....
$caracteres = "34589ABCDEFHKMNPQRTWXYZ";
// Initialisation du code finale
$code = '';
// Tant que le code n'a pas 4 caractère, on lui en ajoute un aléatoirement à partir de la chaine de caractères
while(strlen($code) != 4){
$code .= $liste[rand(0,strlen($liste))];
}
//On va maintenant générer l'image
// on crée une image de 50 pixels par 20 pixels :
$img = imageCreate(100, 30);
//On lui attribue des couleurs
$white = imageColorAllocate($img,255,255,255);
$noir = imageColorAllocate($img,0,0,0);
//On crée le header qui permettra de savoir que ce document est une image
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");
/* On insère la variable $code dans l'image avec la fonction ImageTTFText
Cette fonction permet aussi de choisir la police avec laquelle on écrit, donc autant en mettre une qui soit le plus difficile à lire*/
ImageTTFText($img,30,0,15,25,$noir, 'polices/manuscrit.ttf',$code);
// on crée ensuite l'image jpg compréssé à 40%
imagejpeg($img,'',40);
imageDestroy($img);
/* Pour finir On initialise la variable $_SESSION['code'] avec le code aléatoire, cette variable se retrouvera donc dans la page suivante crypté en md5...*/
$_SESSION['code']= md5($code);
?>
Ce script est la base de cette petite fonctionnalité et permet de créer une valeur à coder qui est ensuite crypté en MD5 dans une session et permet de générer une image avec le code écrit. Enregistrez ce fichier en le nommant « cryptimage.php ».
Réaliser le formulaire
Voici à quoi pourrait ressembler le formulaire à présent qui est dans le fichier « contact.php » :
<form method="post" action="contact.php">
<fieldset>
<legend>Formulaire de contact</legend>
<label for="message">Message</label>
<textarea rows="10" cols="25" name="message" id="message"></textarea>
<label for="code">Code à reproduire</label>
<img title="Captcha" src="cryptimage.php" alt="Captcha" />
<input id="code" name="verif" type="text" />
<button type="submit">Envoyer</button>
</fieldset>
</form>
Nous appelons notre script « cryptimage.php » directement à partir de la balise img, comme celle ci renvoie une image. Maintenant nous allons vérifier, si le formulaire a été validé, la valeur du champ $_POST['verif'] avec la variable de session $_SESSION['code']. Ce qui donne ceci:
if (isset($_POST['message'])){
$erreurs=array();
session_start(); //attention ceci doit être envoyé avant même l'entete HTML!
if($_SESSION['code'] != md5($_POST['verif'])) {
$erreurs[] = 'Erreur dans le code de vérification...';
}
//petite vérification rapide des autres champs
foreach($_POST as $key => $value){
if(empty($value)){
if(empty($erreurs)){
$erreurs[] = 'Certains champs n\'ont pas été renseignés';
}
$erreurs[] = 'le champ '.$key.' n\'est pas rempli';
}
}
}
//...votre page HTML
if(!empty($erreurs) && !empty($_POST['message']){ //vérifie si le tableau erreurs existe et est vide sinon il les affiche
echo '<div class="error">
<ul>';
for($i=0;$i<count($erreurs);$i++){
echo '<li>'.$erreurs[$i].'</li>';
}
echo '</ul>
</div>';
}
else{
//traitement du formulaire
}
Notez que l’initialisation de la session par la fonction session_start(); doit se faire au tout début de votre script. Cette subtilité est une source fréquente d’erreurs.
Si PHP et les sessions ne sont pas votre tasse de thé voici ce qui se passe lors de l’éxécution de ce script:
Notre script peut certainement être amélioré, et notamment du fait que des non-voyants ne pouront pas reconnaître la chaine. Aujourd’hui beaucoup de captcha sont maintenant accompagnés d’un extrait sonore pour eux.
Enfin, il pourra aussi être amélioré afin qu’il soit moins compréhensible pour un robot (ajout de lignes aléatoires, changement de couleurs, fond en dégradé, etc).



