/home/mjc1/public_html/inc_pack/scaptcha/simple-php-captcha.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
<?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'] < $captcha_config['min_length'] = 1;
    if( 
$captcha_config['angle_min'] < $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__strlenrealpath($_SERVER['DOCUMENT_ROOT']) )) . '?_CAPTCHA&amp;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__strlenrealpath($_SERVER['WEB_ROOT']) )) . '?_CAPTCHA&amp;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) == ) {
            
$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) == ) {
            
$rgb_array['r'] = hexdec(str_repeat(substr($hex_str01), 2));
            
$rgb_array['g'] = hexdec(str_repeat(substr($hex_str11), 2));
            
$rgb_array['b'] = hexdec(str_repeat(substr($hex_str21), 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();

    unset(
$_SESSION['_CAPTCHA']);

    
// Pick random background, get info, and start captcha
    
$background $captcha_config['backgrounds'][mt_rand(0count($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(01) == ? -1);

    
// Select font randomly
    
$font $captcha_config['fonts'][mt_rand(0count($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);

}