PHP Classes

File: class.AbsCaptcha.php

Recommend this page to a friend!
  Classes of Costin Trifan   AbsCaptcha   class.AbsCaptcha.php   Download  
File: class.AbsCaptcha.php
Role: Class source
Content type: text/plain
Description: The base class
Class: AbsCaptcha
Generate CAPTCHA validation images
Author: By
Last change: I have updated the documentation and the GenerateCaptcha function
so the session checking is done before generating the captcha image.
Date: 14 years ago
Size: 12,128 bytes
 

Contents

Class file image Download
<?php /* Changelog :: Fri Apr 24, 2009 I have updated the documentation and the GenerateCaptcha function so the session checking is done before generating the captcha image. */ /** * class AbsCaptcha * * The AbsCaptcha is a very simple, fully configurable and easy to * implement class that you can use to generate captcha images. * While you can change the background color, the text color, the * width and the height of the image, you cannot change the size of the text. * It requires the GD library installed and a session started so the * code from the image can be stored in a session variable. * This class will regenerate the captcha image for each page request. * * Disclaimer: * This class might not completely stop bots but will definitely * give them a hard time ;) * * @package AbsCaptcha * @category Captcha * @author Costin Trifan <costintrifan@yahoo.com> * @copyright 2009 Costin Trifan * @licence http://en.wikipedia.org/wiki/MIT_License MIT License * @version 1.0 * * Copyright (c) 2009 Costin Trifan <http://june-js.com/> * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ final class AbsCaptcha { private function __clone(){} # PRIVATE PROPERTIES #================================== private $sess_name = 'X_CAPTCHA_CODE', # The name of the session variable that will hold the captcha's generated code $save_dir = 'captcha', # The path to the directory where to store the created captchas(temporary) $image_name = 'code_img', # The name of the captcha image $width = 100, # The width, in pixels, of the captcha image $height = 50, # The height, in pixels, of the captcha image $code_length = 6, # The number of digits and letters to display in the captcha image $bgColor = array(0, 0, 0), # The background color of the captcha image. (r,g,b) $fgColor = array(255, 255, 0); # The image's text color. (r,g,b) # PUBLIC METHODS #================================== /** * Constructor * * @param string $captcha_session_name The name of the session variable that will hold the captcha's generated code. It's important not to use the default assigned name! * @param string $save_dir The path to the directory where to store the created images. * @param string $image_name The name of the image. The image's extension is not required. * @param array $image_bg_color The image's background color. * @param array $image_fg_color The image's text color. * @param string $code_length The number of digits and letters to display in the image. * @param string $width The width, in pixels, of the captcha image. * @param string $height The height, in pixels, of the captcha image. */ public function __construct( $captcha_session_name='', $save_dir='', $image_name='', $image_bg_color=array(), $image_fg_color=array(), $code_length=NULL, $width=NULL, $height=NULL ) { // GD Library is a MUST ! if ( !extension_loaded('gd') or !function_exists('gd_info')) exit('The <strong>'.__CLASS__.'</strong> class requires the <strong>GD Library</strong> to be able to generate the captcha images!') ; $this->SetSessionName($captcha_session_name); $this->SetDirectory($save_dir); $this->SetImageName($image_name); $this->SetImageBgColor($image_bg_color); $this->SetImageFgColor($image_fg_color); $this->SetCodeLength($code_length); $this->SetImageWidth($width); $this->SetImageHeight($height); } /** * Create the captcha image. * @return boolean */ public function GenerateCaptcha() { // update: Fri Apr 24, 2009 // Makes no sense to generate the image before checking for if the session has been started. (my bad) // If the session hasn't been started, the captcha won't work. if ( ! isset($_SESSION) ) exit('Error: The session was not started! The <strong>'.__CLASS__.'</strong> class requires a session to be started in order to function properly!'); // Create the captcha image $captcha = $this->_create_captcha($this->save_dir, $this->image_name, $this->bgColor, $this->width, $this->height); // Set the background color for lines $line1 = @imagecolorallocate($captcha,233,239,239); $line2 = @imagecolorallocate($captcha, 125, 255, 033); $line3 = @imagecolorallocate($captcha, 105, 155, 200); $line4 = @imagecolorallocate($captcha, 200, 30, 120); $line_yellow = @imagecolorallocate($captcha,255,255,0); $line_gray = @imagecolorallocate($captcha, 128, 128, 128); $forecolor = @imagecolorallocate($captcha, $this->fgColor[0], $this->fgColor[1], $this->fgColor[2]); // Draw some lines. @imageline($captcha, 0,0,104,129,$line1); @imageline($captcha, 10,0,164,129,$line1); @imageline($captcha, 50,0,9,139,$line2); @imageline($captcha, 70,130,32,32,$line3); @imageline($captcha, 80,0,52,52,$line4); @imageline($captcha, 90,0,72,72,$line3); @imageline($captcha, 84,20,12,72,$line_gray); @imageline($captcha, 84,22,13,73,$line_gray); @imageline($captcha, 30,0,120,72,$line1); @imageline($captcha, 100,122,130,73,$line_gray); // Generate a random string $code = md5(uniqid(rand(), true)); // cut string to the length of the digits set to be displayed in the image $string = strtoupper(substr($code,0,$this->GetCodeLength())); // Write the string into the image @imagestring($captcha, 7, 25, 17, $string, $forecolor); // Save the new image @imagepng($captcha, $this->save_dir.$this->image_name, 9, PNG_ALL_FILTERS); // Store the code in the SESSION //if (isset($_SESSION)) $_SESSION[$this->sess_name] = $string; //exit('Error: The session was not started! The <strong>'.__CLASS__.'</strong> class requires a session to be started in order to function properly!'); // Store the code in the SESSION $_SESSION[$this->sess_name] = $string; return TRUE; } # ACCESSOR/MUTATOR METHODS #================================== /** * Set the the name of the session variable that will hold the generated code * * @param string $sess_name The name of the session variable that will hold the captcha's generated code * @return void */ public function SetSessionName( $sess_name = '' ) { if ( (strlen(trim($sess_name)) > 0) and !isset($_SESSION[$sess_name])) $this->sess_name = $sess_name; } /** * Get the the name of the session variable that holds the generated code * @return string */ public function GetSessionName() { return $this->sess_name; } /** * Set the background color of the image * * @param array $image_bg_color The list of colors(r,g,b) to use to fill the image * @return void */ public function SetImageBgColor( $image_bg_color = array() ) { if (count($image_bg_color) < 1) return; if (isset($image_bg_color[0]) and $image_bg_color[0] >= 0) $this->bgColor[0] = $image_bg_color[0]; if (isset($image_bg_color[1]) and $image_bg_color[1] >= 0) $this->bgColor[1] = $image_bg_color[1]; if (isset($image_bg_color[2]) and $image_bg_color[2] >= 0) $this->bgColor[2] = $image_bg_color[2]; } /** * Set the color of the text that will be displayed in the image * * @param array $image_fg_color The list of colors(r,g,b) to use for the text * @return void */ public function SetImageFgColor( $image_fg_color = array() ) { if (count($image_fg_color) < 1) return; if (isset($image_fg_color[0]) and $image_fg_color[0] >= 0) $this->fgColor[0] = $image_fg_color[0]; if (isset($image_fg_color[1]) and $image_fg_color[1] >= 0) $this->fgColor[1] = $image_fg_color[1]; if (isset($image_fg_color[2]) and $image_fg_color[2] >= 0) $this->fgColor[2] = $image_fg_color[2]; } /** * Set the image's code length * * @param string $length The number of digits and letters to display in the captcha image * @return void */ public function SetCodeLength( $length ) { if ( !is_null($length) and $length > 0) $this->code_length = $length; } /** * Get the image's code length * @return number */ public function GetCodeLength() { return $this->code_length; } /** * Set the path to the directory where to save the captcha images * * @param string $save_dir The path to the directory where to store the created captchas(temporary) * @return void */ public function SetDirectory( $save_dir = '' ) { if ( ! empty($save_dir)) { if (is_dir($save_dir)) $this->save_dir = $save_dir; else { if (@mkdir($save_dir)) // try to create the directory $this->save_dir = $save_dir; else exit('Error: The directory where to store the generated captchas could not be found nor created. Please create it manually!'); } } } /** * Get the path to the directory where to save the captcha image * @return string */ public function GetDirectory() { return $this->save_dir; } /** * Get the captcha's code stored in the session * @return string */ public function GetCaptchaCode() { $code = 0; if ( isset($_SESSION) and isset($_SESSION[$this->sess_name])) $code = $_SESSION[$this->sess_name]; return $code; } /** * Set the the name and extension of the image * * @param string $image_name The name of the captcha image * @return void */ public function SetImageName( $image_name = '' ) { if (strlen(trim($image_name)) > 0) $this->image_name = $image_name.'.png'; else $this->image_name .= '.png'; } /** * Get the the name and extension of the image * @return string */ public function GetImageName() { return $this->image_name; } /** * Set the width of the image * * @param string $width In pixels, the width of the captcha image * @return void */ public function SetImageWidth( $width ) { if ( !is_null($width) and $width > 0) $this->width = $width; } /** * Get the width of the image * @return number */ public function GetImageWidth() { return $this->width; } /** * Set the the height of the image * * @param string $height In pixels, the height of the captcha image * @return void */ public function SetImageHeight( $height ) { if ( !is_null($height) and $height > 0) $this->height = $height; } /** * Get the the height of the image * @return number */ public function GetImageHeight() { return $this->height; } # PRIVATE (INTERNAL) METHODS #================================== /** * Convenient function to create the background support image for captchas * @access: internal * @return resource An empty image */ private function _create_captcha( $save_dir, $image_name, array $bgColor, $width, $height ) { // Create image $image = @imagecreatetruecolor($width, $height); // Set background color $color_background = @imagecolorallocate($image, $bgColor[0], $bgColor[1], $bgColor[2]); // Fill the image @imagefill($image, 0, 0, $color_background); return $image; } } // >> END ?>