Very simple Captcha function for forms

There are tonnes of bot scripts floating around the web these days, causing form hell for website administrators who have to sort through the spam hell. One solution to the problem is the use of Captcha codes on web forms.

I have included below a free Captcha function you can use on your website to easily add this functionality.  You will need to have  at least GD-1.8 support in your PHP installation, and this is the default font you will need: monofont.ttf

The script works by taking all the arguments and generating a Captcha Image. It will also output an <img> tag as well, with the Captcha image displayed inline Base64 encoded, so no messing with image paths, just be sure to call the function at the spot in your form where you want the Captcha image.  It will also set a $_SESSION variable with the Captcha code generated so you can check against it once the form is submitted.

function Captcha( $session_var = "captcha_code", $extra="",
                  $font = 'monofont.ttf',
                  $image_width=120, $image_height=40,
                  $characters_on_image = 6,
                  $random_dots = 20,   $random_lines = 4,
                  $captcha_text_color="0x142864",
                  $captcha_noice_color = "0xCCCCCC" ,
                  $possible_letters = '23456789bcdfghjkmnpqrstvwxyz'
                )
 {
 //    Note: JPEG support is only available if PHP was compiled
       against GD-1.8 or later.
 $code = '';
 $i = 0;
 while ($i < $characters_on_image) {
      $code .= substr($possible_letters,
                      mt_rand(0, strlen($possible_letters)-1), 1);
      $i++;
 }

 $font_size = $image_height * 0.75;
 $image = @imagecreate($image_width, $image_height);

 /* setting the background, text and noise colours here */
 $background_color = imagecolorallocate($image, 255, 255, 255);

 $arr_text_color =  array("red" => 0xFF &
                          ( hexdec( $captcha_text_color ) >> 0x10),
 "green" => 0xFF & ( hexdec( $captcha_text_color ) >> 0x8),
 "blue" => 0xFF & hexdec( $captcha_text_color ) );
 $text_color = imagecolorallocate($image, $arr_text_color['red'],
 $arr_text_color['green'], $arr_text_color['blue']);

 $arr_noice_color =  array("red" => 0xFF &
                           ( hexdec( $captcha_noice_color ) >> 0x10),
 "green" => 0xFF & ( hexdec( $captcha_noice_color ) >> 0x8),
 "blue" => 0xFF & hexdec( $captcha_noice_color ) );
 $image_noise_color = imagecolorallocate($image,
                                         $arr_noice_color['red'],
 $arr_noice_color['green'], $arr_noice_color['blue']);

 /* generating the dots randomly in background */
 for( $i=0; $i<$random_dots; $i++ ) {
      imagefilledellipse($image, mt_rand(0,$image_width),
      mt_rand(0,$image_height), 2, 3, $image_noise_color);
 }

 /* generating lines randomly in background of image */
 for( $i=0; $i<$random_lines; $i++ ) {
      imageline($image, mt_rand(0,$image_width),
                mt_rand(0,$image_height),
      mt_rand(0,$image_width), mt_rand(0,$image_height),
                $image_noise_color);
 }

 /* create a text box and add 6 letters code in it */
 $textbox = imagettfbbox($font_size, 0, $font, $code);
 $x = ($image_width - $textbox[4])/2;
 $y = ($image_height - $textbox[5])/2;
 imagettftext($image, $font_size, 0, $x, $y, $text_color,
              $font , $code);

 /* Show captcha image in the page html page */
 ob_start();
 imagejpeg( $image );
 echo '<img src="data:image/jpeg;base64,'.
      chunk_split( base64_encode( ob_get_clean() ) ) .
      '" alt="Captcha Code" ' . $extra . '>';
 imagedestroy($image);//destroying the image instance
 $_SESSION[ $session_var ] = $code;
 }

Hope you can find use for this!

Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *