در میان کلاس های ساخت کد امنیتی کلاس های قوی زیادی وجود دارد که ما امروز قصد داریم یکی از آن ساده ها و در عین حال قوی هایشان را به شما معرفی کنید . دیگر به نیاز به توضیحات نیست زیرا همه شما با آن ها آشنا هستید . امروزه برای افزایش امنیت و جلوگیری از ورود روبات ها از کد های امنیتی استفاده می شود ، اما به راحتی با کمک پی اچ پی و کوکی ها حتی اگر کد امنیتی هم تغییر کند می توان با توابعی مانند cURL در سیستم لاگین کرد که در آینده نمونه کد خوبی در این زمینه معرفی خواهم کرد اما این کد امنیتی چون به کمک SESSION ها کار می کند جلوی نمایش تصویر امنیتی را می گیرد و کاربر فقط در صفحه ای که کد امنیتی وجود دارد می تواند آن را مشاهده کند هر چند در گذشته هم سیستم های قوی وب با این که این زمینه را تقویت نکرده بودند با قرار دادن کد امنیتی راندوم در فایل خود تصویر که با SESSION ها ساخته می شد کاری کرده بودند که اگر کد امنیتی دوباره بارگذاری میشد کد امنیتی قبلی بلااستفاده میشد اما اکنون علاوه بر آن تصویر کد امنیتی هم دیده نمی شود و این باعث می شود که شما به کمک یک کلاس ساده کد امنیتی قوی را برای خود طراحی کنید.
کلاس اصلی به صورت زیر می باشد :
// // A simple PHP CAPTCHA script // // Copyright 2013 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']; // Use milliseconds instead of seconds srand(microtime() * 100); // Generate CAPTCHA code if not set by user if( empty($captcha_config['code']) ) { $captcha_config['code'] = ''; $length = rand($captcha_config['min_length'], $captcha_config['max_length']); while( strlen($captcha_config['code']) < $length ) { $captcha_config['code'] .= substr($captcha_config['characters'], rand() % (strlen($captcha_config['characters'])), 1); } } // Generate HTML for image src $image_src = substr(__FILE__, strlen( realpath($_SERVER['DOCUMENT_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(); unset($_SESSION['_CAPTCHA']); // Use milliseconds instead of seconds srand(microtime() * 100); // Pick random background, get info, and start captcha $background = $captcha_config['backgrounds'][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 = rand( $captcha_config['angle_min'], $captcha_config['angle_max'] ) * (rand(0, 1) == 1 ? -1 : 1); // Select font randomly $font = $captcha_config['fonts'][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 = 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 = rand($text_pos_x_min, $text_pos_x_max); $text_pos_y_min = $box_height; $text_pos_y_max = ($bg_height) - ($box_height / 2); $text_pos_y = 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); }
حال فایل جدیدی را می سازیم و از کد زیر برای ساخت تصویر امنیتی استفاده می کنیم :
session_start(); include("simple-php-captcha.php"); $_SESSION['captcha'] = simple_php_captcha();
حال که تابع simple_php_captcha را برای متغیر []SESSION_$ استفاده کردیم بعد از باگذاری صفحه ، اطلاعات زیر در قالب Array در این متغیر ساخته می شود (مانند) :
Array ( [code] => TjxD5 [image_src] => simple-php-captcha.php?_CAPTCHA&t=0.58137700+1413454747 )
حال این اطلاعات را میتوانیدبا متغیر های زیر دریافت کنید :
$_SESSION['captcha']['code'] AND $_SESSION['captcha']['image_src']
خوب حال کافیست در تگ <img> به جای لینک تصویر از متغیر image_src استفاده کنیم مانند کد زیر :
echo '<img src="' . $_SESSION['captcha']['image_src'] . '" alt="CAPTCHA code">';
حال برای دریافت مقدار کد امنیتی توسط سرور که بتواند با کد کاربر بررسی کند تا صحت آن را تشخیص دهد می توانید از دیتای Code که در Array دیده می شود مانند کد زیر استفاده نمایید:
$_SESSION['captcha']['code']
فرقی ندارد فرم اطلاعات را با آژاکس ارسال نماید یا نه ، همچنین برای بررسی کد می توانید از یکی از ۲ تابع strtolower()
یا strtoupper()
در پی اچ پی کمک بگیرید . خوب حالا شما به کمک کد زیر می توانید تنظیمات اساسی تصویر یا کد امنیتی را از همان صفحه که آن را بارگذاری می کنید تغییر دهید :
$_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 ));
از کد زیر می توانید برای نمایش فارسی کد امنیتی استفاده کنید : (فایل پیوست شده است)
$_SESSION['captcha'] = simple_php_captcha( array( 'fonts' => array('fonts/byekan.ttf'), 'characters' => '0123456789', ));
چند نکته کلیدی در مورد کلاس :
۱.همیشه قبل از آغاز کلاس مطمئن شوید که SESSION_START نوشته شده باشد .
۲.برای ساخت کد امنیتی شما نیاز به کتابخانه GD2 در پی اچ پی دارید که اکثر هاستینگ ها دارا می باشند.
۳.تصاویر پس زمینه حتما باید با فرمت PNG باشند.
۴.فرمت فونت هایی که برای تصویر یا همان کد امنیتی انتخاب می کنید باید TTF یا OTF باشند.
۵.در آدرس دهی به تصاویر پس زمینه و فونت ها دقت داشته باشید آدرس فایل را کامل بدهید .
(مانند : [SERVER['DOCUMENT_ROOT'] . '/' . [path-to-file_$)
چند نکته برای فارسی سازی کلاس :
۱.از فونت های فارسی اصلاح شده استفاده نمایید.
۲.حتما متغیر کد امنیتی را از اعداد و حروف انگلیسی به اعداد فارسی تبدیل کنید تا مشکلی پیش نیاید.
تصاویر نمونه کد امنیتی فارسی و انگلیسی :