How to integrate Simple-PHP-Captcha scripts into Website to verify Forms Submitted by Humans

  • Hi. Trying to implement  Simple-PHP-Captcha scripts into my website to verify that Request Form is submitted by humans. I’ve built website utilizing WebPlus X8 that supports PHP. WebPlus has  Forms page  HTML function and Setup function. I’m new at building websites. Please refer to PHP scripts (2 files) below and attached photo of Simple-PHP-Captcha folder content. Should I insert the 2 files PHP scripts into the Request Form page via HTML edit? If so then where in HTML page and in what order (which script comes after which script)? Or should I upload the 2 PHP scripts files to the Host Server (Supports PHP) and in the Request Form webpage put “pointers” to “call” the uploaded PHP scripts files to run Captcha? And do I have to upload any other files (png files in  background folder, ttf files in  fonts folder, … other library files) from Simple-PHP-Captcha folder? If so then how to do this : In the Forms page HTML edit or the Forms page Setup (step-by-step methods)? Or is there another way to go about integrating Simple-PHP-Captcha codes scripts to have CAPTCHA in my webstie to verify Forms submissions? Thank you. 

Codes in simple-php-captcha.php file

<?php
//
// A simple PHP CAPTCHA script
//
// Copyright 2011 by Cory LaViska for A Beautiful Site, LLC
//
// See readme.md for usage, demo, and licensing info
//
function simple_php_captcha($config = array()) {

// Check for GD library
if( !function_exists(‘gd_info’) ) {
throw new Exception(‘Required GD library is missing’);
}

$bg_path = dirname(__FILE__) . ‘/backgrounds/’;
$font_path = dirname(__FILE__) . ‘/fonts/’;

// Default values
$captcha_config = array(
‘code’ => ‘’,
‘min_length’ => 5,
‘max_length’ => 5,
‘backgrounds’ => array(
$bg_path . ‘45-degree-fabric.png’,
$bg_path . ‘cloth-alike.png’,
$bg_path . ‘grey-sandbag.png’,
$bg_path . ‘kinda-jean.png’,
$bg_path . ‘polyester-lite.png’,
$bg_path . ‘stitched-wool.png’,
$bg_path . ‘white-carbon.png’,
$bg_path . ‘white-wave.png’
),
‘fonts’ => array(
$font_path . ‘times_new_yorker.ttf’
),
‘characters’ => ‘ABCDEFGHJKLMNPRSTUVWXYZabcdefghjkmnprstuvwxyz23456789’,
‘min_font_size’ => 28,
‘max_font_size’ => 28,
‘color’ => ‘#666’,
‘angle_min’ => 0,
‘angle_max’ => 10,
‘shadow’ => true,
‘shadow_color’ => ‘#fff’,
‘shadow_offset_x’ => -1,
‘shadow_offset_y’ => 1
);

// Overwrite defaults with custom config values
if( is_array($config) ) {
foreach( $config as $key => $value ) $captcha_config[$key] = $value;
}

// Restrict certain values
if( $captcha_config[‘min_length’] < 1 ) $captcha_config[‘min_length’] = 1;
if( $captcha_config[‘angle_min’] < 0 ) $captcha_config[‘angle_min’] = 0;
if( $captcha_config[‘angle_max’] > 10 ) $captcha_config[‘angle_max’] = 10;
if( $captcha_config[‘angle_max’] < $captcha_config[‘angle_min’] ) $captcha_config[‘angle_max’] = $captcha_config[‘angle_min’];
if( $captcha_config[‘min_font_size’] < 10 ) $captcha_config[‘min_font_size’] = 10;
if( $captcha_config[‘max_font_size’] < $captcha_config[‘min_font_size’] ) $captcha_config[‘max_font_size’] = $captcha_config[‘min_font_size’];

// Generate CAPTCHA code if not set by user
if( empty($captcha_config[‘code’]) ) {
$captcha_config[‘code’] = ‘’;
$length = mt_rand($captcha_config[‘min_length’], $captcha_config[‘max_length’]);
while( strlen($captcha_config[‘code’]) < $length ) {
$captcha_config[‘code’] .= substr($captcha_config[‘characters’], mt_rand() % (strlen($captcha_config[‘characters’])), 1);
}
}

// Generate HTML for image src
if ( strpos(\_SERVER['SCRIPT\_FILENAME'], _SERVER[‘DOCUMENT_ROOT’]) ) {
image\_src=substr(\_\_FILE\_\_, strlen( realpath(_SERVER[‘DOCUMENT_ROOT’]) )) . ‘?_CAPTCHA&t=’ . urlencode(microtime());
$image_src=’/’ . ltrim(preg_replace(’/\\/’, ‘/’, image\_src), '/'); } else { _SERVER[‘WEB_ROOT’] = str_replace(\_SERVER['SCRIPT\_NAME'], '', _SERVER[‘SCRIPT_FILENAME’]);
image\_src=substr(\_\_FILE\_\_, strlen( realpath(_SERVER[‘WEB_ROOT’]) )) . ‘?_CAPTCHA&t=’ . urlencode(microtime());
$image_src=’/’ . ltrim(preg_replace(’/\\/’, ‘/’, $image_src), ‘/’);
}

$_SESSION[’_CAPTCHA’][‘config’] = serialize($captcha_config);

return array(
‘code’ => $captcha_config[‘code’],
‘image_src’ => $image_src
);

}

if( !function_exists(‘hex2rgb’) ) {
function hex2rgb($hex_str, $return_string = false, $separator = ‘,’) {
$hex_str = preg_replace("/[^0-9A-Fa-f]/", ‘’, $hex_str); // Gets a proper hex string
$rgb_array = array();
if( strlen($hex_str) == 6 ) {
$color_val = hexdec($hex_str);
$rgb_array[‘r’] = 0xFF & ($color_val >> 0x10);
$rgb_array[‘g’] = 0xFF & ($color_val >> 0x8);
$rgb_array[‘b’] = 0xFF & $color_val;
} elseif( strlen($hex_str) == 3 ) {
$rgb_array[‘r’] = hexdec(str_repeat(substr($hex_str, 0, 1), 2));
$rgb_array[‘g’] = hexdec(str_repeat(substr($hex_str, 1, 1), 2));
$rgb_array[‘b’] = hexdec(str_repeat(substr($hex_str, 2, 1), 2));
} else {
return false;
}
return $return_string ? implode($separator, $rgb_array) : $rgb_array;
}
}

// Draw the image
if( isset($_GET[’_CAPTCHA’]) ) {

session_start();

captcha\_config = unserialize(_SESSION[’_CAPTCHA’][‘config’]);
if( !$captcha_config ) exit();

if( isset(\_GET['\_RENDER']) ) { _SESSION[’_CAPTCHA’] = simple_php_captcha();
} else {
unset($_SESSION[’_CAPTCHA’]);
}

// Pick random background, get info, and start captcha
$background = $captcha_config[‘backgrounds’][mt_rand(0, count($captcha_config[‘backgrounds’]) -1)];
list($bg_width, $bg_height, $bg_type, $bg_attr) = getimagesize($background);

$captcha = imagecreatefrompng($background);

$color = hex2rgb($captcha_config[‘color’]);
$color = imagecolorallocate($captcha, $color[‘r’], $color[‘g’], $color[‘b’]);

// Determine text angle
$angle = mt_rand( $captcha_config[‘angle_min’], $captcha_config[‘angle_max’] ) * (mt_rand(0, 1) == 1 ? -1 : 1);

// Select font randomly
$font = $captcha_config[‘fonts’][mt_rand(0, count($captcha_config[‘fonts’]) - 1)];

// Verify font file exists
if( !file_exists($font) ) throw new Exception('Font file not found: ’ . $font);

//Set the font size.
$font_size = mt_rand($captcha_config[‘min_font_size’], $captcha_config[‘max_font_size’]);
$text_box_size = imagettfbbox($font_size, $angle, $font, $captcha_config[‘code’]);

// Determine text position
$box_width = abs($text_box_size[6] - $text_box_size[2]);
$box_height = abs($text_box_size[5] - $text_box_size[1]);
$text_pos_x_min = 0;
$text_pos_x_max = ($bg_width) - ($box_width);
$text_pos_x = mt_rand($text_pos_x_min, $text_pos_x_max);
$text_pos_y_min = $box_height;
$text_pos_y_max = ($bg_height) - ($box_height / 2);
if ($text_pos_y_min > $text_pos_y_max) {
$temp_text_pos_y = $text_pos_y_min;
$text_pos_y_min = $text_pos_y_max;
$text_pos_y_max = $temp_text_pos_y;
}
$text_pos_y = mt_rand($text_pos_y_min, $text_pos_y_max);

// Draw shadow
if( $captcha_config[‘shadow’] ){
$shadow_color = hex2rgb($captcha_config[‘shadow_color’]);
$shadow_color = imagecolorallocate($captcha, $shadow_color[‘r’], $shadow_color[‘g’], $shadow_color[‘b’]);
imagettftext($captcha, $font_size, $angle, $text_pos_x + $captcha_config[‘shadow_offset_x’], $text_pos_y + $captcha_config[‘shadow_offset_y’], $shadow_color, $font, $captcha_config[‘code’]);
}

// Draw text
imagettftext($captcha, $font_size, $angle, $text_pos_x, $text_pos_y, $color, $font, $captcha_config[‘code’]);

// Output image
header(“Content-type: image/png”);
imagepng($captcha);

}

Codes in index.php file

<?php
session_start();
$_SESSION = array();

include(“simple-php-captcha.php”);
$_SESSION[‘captcha’] = simple_php_captcha();

?>
<!DOCTYPE html>
<html>
<head>
<title>Example » A simple PHP CAPTCHA script</title>
<style type=“text/css”>
pre {
border: solid 1px #bbb;
padding: 10px;
margin: 2em;
}

img {
border: solid 1px #ccc;
margin: 0 2em;
}
</style>
</head>
<body>
<h1>
CAPTCHA Example
</h1>

<h2>Usage</h2>

<p>
The following code will prepare a CAPTCHA image and keep the code in a session
variable for later use:
</p>

<pre>
<?php
session_start();
include(“simple-php-captcha.php”);
$_SESSION[‘captcha’] = simple_php_captcha();
?>
</pre>

<p>
After the call to <code>simple_php_captcha()</code> above,
<code>$_SESSION[‘captcha’]</code> will be something like this:
</p>

<pre>
<?php
print_r($_SESSION[‘captcha’]);
?>
</pre>

<p>
To display the CAPTCHA image, create an HTML <code><img></code> using
<code>$_SESSION[‘captcha’][‘image_src’]</code> as the <code>src</code> attribute:
</p>

<p>
<?php
echo ‘<img src="’ . $_SESSION[‘captcha’][‘image_src’] . ‘" alt=“CAPTCHA code”>’;

?>
</p>

<p>
To verify the CAPTCHA value on the next page load (or in an AJAX request), test
against <code>$_SESSION[‘captcha’][‘code’]</code>. You can use
<code>strtolower()</code> or <code>strtoupper()</code> to perform a
case-insensitive match.
</p>

<h2>Configuration</h2>
<p>
Configuration is easy and all values are optional. To specify one or more options,
do this:
</p>

<pre>
<?php

$_SESSION[‘captcha’] = simple_php_captcha( array(
‘min_length’ => 5,
‘max_length’ => 5,
‘backgrounds’ => array(image.png’, …),
‘fonts’ => array(‘font.ttf’, …),
‘characters’ => ‘ABCDEFGHJKLMNPRSTUVWXYZabcdefghjkmnprstuvwxyz23456789’,
‘min_font_size’ => 28,
‘max_font_size’ => 28,
‘color’ => ‘#666’,
‘angle_min’ => 0,
‘angle_max’ => 10,
‘shadow’ => true,
‘shadow_color’ => ‘#fff’,
‘shadow_offset_x’ => -1,
‘shadow_offset_y’ => 1
));

>
</pre>

<h2>Notes</h2>
<ul>
<li>
<strong>Important!</strong> Make sure you call <code>session_start()</code> before
calling the <code>simple_php_captcha()</code> function
</li>
<li>
Requires PHP GD2 library
</li>
<li>
Backgound images must be in PNG format
</li>
<li>
Fonts must be either TTF or OTF
</li>
<li>
Backgrounds and fonts must be specified using their full paths (tip: use
<code>\_SERVER['DOCUMENT\_ROOT'] . '/' . [path-to-file]\</code\>) \</li\> \<li\> Angles should not exceed approximately 15 degrees, as the text will sometimes appear outside of the viewable area \</li\> \<li\> Creates a function called \<code\>simple\_php\_captcha()\</code\> in the global namespace \</li\> \<li\> Uses the \<code\>_SESSION[‘simple-php-captcha’]</code> session variable
</li>
</ul>

</body>
</html>

Content of Simple-PHP-Captcha folder (Downloaded from GitHub site)