روشن فکری بنیان ماست !

ما هرگز نمی گذاریم حوصله شما سربرود !

اللَّهُ نُورُ السَّمَاوَاتِ وَالْأَرْضِ مَثَلُ نُورِهِ کَمِشْکَاةٍ فِیهَا مِصْبَاحٌ الْمِصْبَاحُ فِی زُجَاجَةٍ الزُّجَاجَةُ کَأَنَّهَا کَوْکَبٌ دُرِّیٌّ یُوقَدُ مِن شَجَرَةٍ مُّبَارَکَةٍ زَیْتُونِةٍ لَّا شَرْقِیَّةٍ وَلَا غَرْبِیَّةٍ یَکَادُ زَیْتُهَا یُضِیءُ وَلَوْ لَمْ تَمْسَسْهُ نَارٌ نُّورٌ عَلَی نُورٍ یَهْدِی اللَّهُ لِنُورِهِ مَن یَشَاءُ وَیَضْرِبُ اللَّهُ الْأَمْثَالَ لِلنَّاسِ وَاللَّهُ بِکُلِّ شَیْءٍ عَلِیمٌ ( برخی از خواص آینه ۳۵ سوره نور از کتاب قرآن کریم )
هرگونه کپی برداری از فایل های اختصاصی پیگرد قانونی دارد لذا در صورت کپی مطالب لینک دریافت آن ها را تغییر ندهید .
روشن فکری بنیان ماست !

به نام او که یادش ترنم عارفانه زندگیست . سلام من سید امیرحسین طــاووســی هستم طــراح و برنامه نویس وب . فـعالیتم را در زمینه کــامپـیوتـر قبل از سـال اول دبـسـتـان شـروع کــردم و تا دوره راهنمایی اطلاعات کاملی از این تکنولوژی بدست آوردم . از ان دوره تا کنون در زمینه های مختلف فعالیت می کنم که مهـم ترین آن برنامه نویسی وب است یکی از عواملی که باعث شد تا به این سمت بیام کـدباز بودن زبان های وب هستش و روز به روز به دانستنیهایم در این زمینه می افزایم. شاد و سرزنده باشید , امیر

جستجو در وبلاگ
آخرین نظرات

درصد پیشرفت پروژه ها

Projects Progress
اسکریپت اشتراک ویدیو + منتظر بزرگترین سوپرایز وبلاگ من در فروردین ۹۵ باشید۷۹ درصد

دریافت جزیات اسکریپت اشتراک ویدیو

معرفی کلاس simple-php-captcha

پنجشنبه, ۲۴ مهر ۱۳۹۳، ۰۲:۲۸ ب.ظ

در میان کلاس های ساخت کد امنیتی کلاس های قوی زیادی وجود دارد که ما امروز قصد داریم یکی از آن ساده ها و در عین حال قوی هایشان را به شما معرفی کنید . دیگر به نیاز به توضیحات نیست زیرا همه شما با آن ها آشنا هستید . امروزه برای افزایش امنیت و جلوگیری از ورود روبات ها از کد های امنیتی استفاده می شود ، اما به راحتی با کمک پی اچ پی و کوکی ها حتی اگر کد امنیتی هم تغییر کند می توان با توابعی مانند 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_$)

چند نکته برای فارسی سازی کلاس :

۱.از فونت های فارسی اصلاح شده استفاده نمایید.

۲.حتما متغیر کد امنیتی را از اعداد و حروف انگلیسی به اعداد فارسی تبدیل کنید تا مشکلی پیش نیاید.

تصاویر نمونه کد امنیتی فارسی و انگلیسی :

من سید امیرحسین طــاووســی هستم طــراح و برنامه نویس وب . فـعالیتم را در زمینه کــامپـیوتـر قبل از سـال اول دبـسـتـان شـروع کــردم و تا دوره راهنمایی اطلاعات کاملی از این تکنولوژی بدست آوردم . از ان دوره تا کنون در زمینه های مختلف فعالیت می کنم که مهـم ترین آن برنامه نویسی وب است یکی از عواملی که باعث شد تا به این سمت بیام کـدباز بودن زبان های وب هستش و روز به روز به دانستنیهایم در این زمینه می افزایم. شاد و سرزنده باشید .

رمز فایل ها در بیان باکس : tavousi.name

در صورت مشکل در دانلود فایل ها و یا حذف شدن آن ها ما را مطلع نمایید .

نظرات  (۱)

  • شایان بمانیان
  • بسیار عالی!

    ارسال نظر

    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی