<?php
/**********************************************************************

uses $_SESSION['v_code_hash']

*  Can be cookie independent if browser did not send a session cookie:
    - session.use_only_cookies must be disabled. If enabled, session module does not search GET/POST vars for session id
*  This outputs a captcha image and sets $_SESSION['time_start'] and $_SESSION['v_code_hash']
*  When cookie independent, assume session id is in malicious hands
*  Implement this image 1 of 2 ways:
*  - in CSS: <style> #yourinputID { background: url('inc/v_image.php?<?php echo SID ?>') white 50% 0% no-repeat; }
*  - in HTML markup as <img src="v_image.php?<?php echo SID ?>" alt="" title="" />
*  Debug: enable $debug and watch error_log
*  see v_require.php for further instructions
**********************************************************************/
if ( !function_exists("gd_info") ) die ("Graphics support not found, enable the GD extension in php.ini");

$debug false;

ini_set('session.use_only_cookies''0');
session_name(strtolower(session_name()));     # xhtml lower case, in case limited access to php.ini
session_start();

if (
$debug)
{
    
$fmsg basename(__FILE__)."[".__LINE__."] some current session configs ...".PHP_EOL;
    
$fmsg .= "\t session_name = ".session_name().PHP_EOL;
    
$fmsg .= "\t session.use_cookies = ".ini_get('session.use_cookies').PHP_EOL;
    
$fmsg .= "\t session.use_only_cookies = ".ini_get('session.use_only_cookies').PHP_EOL;
    
$fmsg .= "\t session.use_trans_sid = ".ini_get('session.use_trans_sid').PHP_EOL;
    
$fmsg .= "\t url_rewriter.tags = ".ini_get('url_rewriter.tags').PHP_EOL;
    
error_log($fmsg);
}

// A CHANCE TO OVER-RIDE SOME IMAGE DEFAULTS (and so we can call this directly to debug)
$vCodeLen    = isset($_SESSION['vCodeLen']) ? $_SESSION['vCodeLen'] : 3;
$v_img_width    = isset($_SESSION['v_img_width']) ? $_SESSION['v_img_width'] : 100;
$v_img_height    = isset($_SESSION['v_img_height']) ? $_SESSION['v_img_height'] : 19;
$v_img_color_bg    = isset($_SESSION['v_img_color_bg']) ? $_SESSION['v_img_color_bg'] : "fff";
$v_img_color_txt = isset($_SESSION['v_img_color_txt']) ? $_SESSION['v_img_color_txt'] : "888";


// OK, let's get started with this captcha
$alphanum "abcdefghijkmnopqrstuvwxyz0123456789";        // L removed
$v_img_txt substr(str_shuffle($alphanum), 0$vCodeLen);
$_SESSION['v_code_hash'] = md5($v_img_txt);            // hash this so not visible in session file

// Create start of reply timelimit on each page load
$_SESSION['time_start'] = $_SERVER['REQUEST_TIME'];

// Convert hex color codes to R, G, B string
function hex_to_rgb($h) {

    if (
strpos($h'#') === 0) { 
        
$h substr($h1);
    }
    
$arrRGB = array();
    if (
strlen($h) == 6) {
        
$arrRGB[] = (int)hexdec(substr($h02));
        
$arrRGB[] = (int)hexdec(substr($h22));
        
$arrRGB[] = (int)hexdec(substr($h42));
    } else if (
strlen($h) == 3) {
        
$arrRGB[] = (int)hexdec(substr($h01) . substr($h01));
        
$arrRGB[] = (int)hexdec(substr($h11) . substr($h11));
        
$arrRGB[] = (int)hexdec(substr($h21) . substr($h21));
    }
    return 
$arrRGB;
}

// create the image
$image imagecreate($v_img_width$v_img_height);

// set the background color
list($rr$gg$bb) = hex_to_rgb($v_img_color_bg);
imagecolorallocate ($image$rr$gg$bb);

// set the text color
list($rr$gg$bb) = hex_to_rgb($v_img_color_txt);
$v_img_color_txt imagecolorallocate ($image$rr$gg$bb);

// add the verification code to the image, and remove it from $_SESSION
imagestring ($image5351$v_img_txt$v_img_color_txt);

// dwb, add a line through, adds a little ocr difficulty
//imageline($image, $x1, $y1, $x2, $y2, $color);

// send several headers to make sure the image is not cached 
// taken directly from the PHP Manual
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");    // always modified
// HTTP/1.1 - lower case suggested fix for FF caching (not related to the image caching issue)
header("cache-control: no-store,no-cache,must-revalidate,max-age=-1");
header("cache-control: post-check=0,pre-check=0"false);
header("pragma: no-store,no-cache");    // HTTP/1.0

// send the content type header so the image is displayed properly
header('Content-type: image/jpeg');

// send the image to the browser
imagejpeg($image);

// destroy the image to free up the memory
imagedestroy($image);

?>