Php - Simple image captcha utilisant les sessions

Pour générer une image "captchat", servant par exemple à vérifier qu'un formulaire est bien envoyé par un internaute et non par un bot, nous pouvons utiliser la classe de Simon Jarvis.

En voici la source :
<?php session_start();

/** File: CaptchaSecurityImages.php* Author: Simon Jarvis* Copyright: 2006 Simon Jarvis* Date: 03/08/06* Updated: 07/02/07* Requirements: PHP 4/5 with GD and FreeType libraries* Link: http://www.white-hat-web-design.co.uk/articles/php-captcha.php* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version.* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details: * http://www.gnu.org/licenses/gpl.html**/

class CaptchaSecurityImages {

var $font = 'monofont.ttf';

function generateCode($characters) { /* list all possible characters, similar looking characters and vowels have been removed */ $possible = '23456789bcdfghjkmnpqrstvwxyz'; $code = ''; $i = 0; while ($i < $characters) { $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1); $i++; } return $code; }

function CaptchaSecurityImages($width='120',$height='40',$characters='6') { $code = $this->generateCode($characters); /* font size will be 75% of the image height */ $font_size = $height * 0.75; $image = imagecreate($width, $height) or die('Cannot initialize new GD image stream'); /* set the colours */ $background_color = imagecolorallocate($image, 255, 255, 255); $text_color = imagecolorallocate($image, 20, 40, 100); $noise_color = imagecolorallocate($image, 100, 120, 180); /* generate random dots in background */ for( $i=0; $i<($width*$height)/3; $i++ ) { imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color); } /* generate random lines in background */ for( $i=0; $i<($width*$height)/150; $i++ ) { imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color); } /* create textbox and add text */ $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function'); $x = ($width - $textbox[4])/2; $y = ($height - $textbox[5])/2; imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function'); /* output captcha image to browser */ header('Content-Type: image/jpeg'); imagejpeg($image); imagedestroy($image); $_SESSION['security_code'] = $code; }

}

$width = isset($_GET['width']) && $_GET['width'] < 600 ? $_GET['width'] : '120';$height = isset($_GET['height']) && $_GET['height'] < 200 ? $_GET['height'] : '40';$characters = isset($_GET['characters']) && $_GET['characters'] > 2 ? $_GET['characters'] : '6';

$captcha = new CaptchaSecurityImages($width,$height,$characters);

?>

 

Copiez et collez le code ci-dessus, et enregistrez le sous CaptchaSecurityImages.php . Vous devez également placer une copie de la police "Monofont" dans le même répertoire que le fichier nouvellement créé. ( Vous pouvez, à la place de $font = 'monofont.ttf'; mettre le nom de la police de votre choix, tant que vous avez le fichier .ttf correspondant).

Placez ensuite le code suivant dans votre formulaire. Il va générer une image contenant une chaîne aléatoire, au dessus du champs de texte dans lequel l'internaut recopiera l'image.
<img src="CaptchaSecurityImages.php" />Security Code:
<input id="security_code" name="security_code" type="text" />

Vous pouvez également spécifier certaines options dans l'image, en insérant des arguments au fichier CaptchaSecurityImages.php ( via $_GET, avec ?variable=valeur) .

Par exemple :
<img src="CaptchaSecurityImages.php?width=100&height=40&characters=5" alt="captcha" /> <input id="security_code" name="security_code" type="text" />

Le code ci-dessus générera une image de 100px sur 40, qui contiendra 5 caractères.

Placez le code ci-dessous sur la page qui réceptionnera votre formulaire. Il va vérifier que la saisie de l'utilisateur correspond bien à l'image.
<?php

session_start();
if(($_SESSION['security_code'] == $_POST['security_code']) && (!empty($_SESSION['security_code'])) ) {
// Insérez ici le code à éxecuter lorsque l'utilisateur a bien recopié le champs de texte.
unset($_SESSION['security_code']);
} else {
// Insérez ici le message d'erreur, en cas de mauvaise saisie.
}
?>

 

Si vous préférez que votre image apparaisse comme une "vraie" image, tel un fichier .jpg, vouc pouvez utilisez la réécriture d'url. Il vous suffit d'utiliser le code ci-dessous, qui vous permettra d'appeller l'image captcha.jpg.(<img src="captcha.jpg" /> ).
RewriteEngine on
RewriteRule captcha.jpg /CaptchaSecurityImages.php

Vous pouvez, si vous le souhaitez, modifier la couleur du captcha. Il vous suffit d'éditer les variables  background_colour, text_colour et noise_colourµ. La fonction  imagecolorallocate()  génère une couleur à partir d'informations RGB. Pourquoi ne pas, alors, génère une image aux couleurs aléatoires, en utilisant rand() ou mt_rand ?

 

Source : http://www.white-hat-web-design.co.uk/articles/php-captcha.php
Gpenverne

Gpenverne

Dév back, symfonien, adore bidouiller des machins pour faire des bidules, sans se poser la question de leur utilité...

Read More