کد ایجاد تصویر امنیتی ساده (کپچا) در PHP

daskhatmin فواد طهماسبی
48,821 بازدید
کد ایجاد تصویر امنیتی ساده (کپچا) در PHP

وارد کردن کد امنیتی (کپچا) در وبسایتها، گاها برای کاربران واقعی، کاری بسیار دشوار و آزار دهنده است است.  jReply یک اسکریپت برای نمایش کد امنیتی در وبسایتمان برای کاربران نوشته است، که در عین راحتی در نوشتن برای کاربران واقعی، از ورود روباتها نیز جلوگیری میکند. کد نوشته شده نیز به منظور راحتی در تطبیق و تغییر آن ساده و قابل درک نوشته شده است.

کد زیر همان کد استفاده شده در اسکریپت تصویر امنیتی ساده (کپچا) است . توجه کنید که کد زیر به تنهایی کار نمیکند و نیازمند فونت و لیست لغات است که به صورت کامل ضمیمه شده. این کد جهت مطالعه قرار داده شده است.

<?php

  function warpedCaptcha($text)
  {
   /*
    this function takes the original captcha text and shuffles
	the vowels + y around in order to deliver more variable 
	captcha text
   */
   if (5 > rand(0,6)) return $text;
   //only parttime warping
   $ltrs = array('b'=>'b','c'=>'c','d'=>'d','f'=>'f','g'=>'g','h'=>'h','j'=>'j',
               'k'=>'k','l'=>'l','m'=>'m','n'=>'n','p'=>'p','q'=>'q','r'=>'r',
			   's'=>'s','t'=>'t','v'=>'v','w'=>'w','x'=>'x','z'=>'z');

  $vkeys = $vltrs = explode(',','a,e,i,o,u,y');
  shuffle($vkeys);
  $vowels = array();
  foreach($vkeys as $ndx=>$vkey) $vowels[$vkey] = $vltrs[$ndx];
  //the vowels + y are now jumbled up

  $ltrs = array_merge($ltrs,$vowels);
  //full associative array of alphabet with randomized vowels + y
  $text = str_split($text);

  $captcha = '';
  foreach($text as $txt) $captcha .= $ltrs[$txt];
  return $captcha;
 }

 /*
  xsixlw.txt is a long string of 6 letter words concatenated together.
  We pick a word at random from this text
 */
 $fp = fopen('xsixlw.txt',"r");
 $count = filesize('xsixlw.txt')/6 - 1;
 $pos = 6*rand(0,$count);
 fseek($fp,$pos);
 $captcha = warpedCaptcha(trim(fread($fp,6)));
 fclose($fp);

 session_start();
 $_SESSION['captcha'] = $captcha;
 //store the captcha to check later once the user has solved it
 session_write_close();

 $im = imagecreatetruecolor(200,70);//200 x 70 pixel image
 $black = imagecolorallocate($im,0,0,0);
 imagecolortransparent($im,$black);//give it a black background

 switch(rand(0,4))
 {
  case 0:$color = imagecolorallocate($im,34,155,91);break;
  case 1:$color = imagecolorallocate($im,233,26,74);break;
  case 2:$color = imagecolorallocate($im,233,26,195);break;
  case 3:$color = imagecolorallocate($im,244,178,19);break;
  case 4:$color = imagecolorallocate($im,53,125,199);break;
 } 
 //pick a random color for the text

 $x = 20;$y = 47;//the starting position for drawing
 for ($i=0;$i<6;$i++)
 {
  $angle = rand(-8,8) + rand(0,9)/10;
  $fontsize = rand(22,32);//pick a random font size
  $letter = substr($captcha,$i,1);
  $coords = imagettftext($im,$fontsize,$angle,$x,$y,$color,'oldsans.ttf',$letter);
  //draw each letter
  $x += ($coords[2]-$x) + 1;
 }

header('Content-type:image/png');
imagepng($im);
imagedestroy($im);
?>

 

نحوه استفاده از اسکریپت تصویر امنیتی:

۱- استخراج فایلها (Extract Files) در یک فولدر مناسب در سرور:

simplephpcaptcha.php
xsixlw.txt 
ldsans.ttf

۲- در صفحه ای که میخواهید از تصویر امنیتی (کپچا) استفاده کنید، کد زیر را بنویسید:

<img height="70" width="200" src="path_to_folder/simplecaptcha.php"/>

۳- ایجاد یک فیلد متنی برای دریافت کد امنیتی :

<form action="" method="post">
	<input type="text" name="captcha" />
	<input type="submit" name="submit" />
</form>

۴- بررسی صحت کد امنیتی وارد شده در سمت سرور:

<?
session_start();
if(isset($_POST['submit'])){
	if($_SESSION['captcha'] == $_POST['captcha']){
		echo "Captcha Is Correct<br>";
	}else{
		echo "Captcha Isn't Correct<br>";
	}
}
?>

.در صورت درست یا غلط بودن کد وارد شده پیامی ظاهر میشود که نتیجه کار را مشخص میکند. شما میتوانید به جای این پیغامها، هر عملی که باید در اسکریپتتان انجام شود را بنویسید.

 

simple-captcha

پیش نمایش فایلهای آموزش

daskhatmin

فواد طهماسبی

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

30 دیدگاه برای “کد ایجاد تصویر امنیتی ساده (کپچا) در PHP”

  1. حاجی زاده گفت:

    سلام . سایت من http://www.rhaghighi.ir
    چند روزی هست که من و شاگردانم نمیتونیم وارد سایت بشیم . میگن باید روی فرم های سایت کد کپچا بزاریم تا سایت باز بشه . شما میتونین ما رو راهنمایی کنین ؟ ممنونم

    1. سلام،
      از چه سیستمی برای سایتتون استفاده میکنید؟

  2. ارمان گفت:

    ممنون عالی بووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووود

  3. یاسر رمضانی گفت:

    عالی بود.
    خیلی ممنون دوست عزیز

  4. sahar گفت:

    با سلام
    ما پروژه ای تحت عنوان امنیت قسمت کپ چا داریم که اطلاعات در این زمینه خیلی کمه .شما اطلاعاتی دارین اگه با پرداخت هزینه ما رو در این زمینه راهنمایی کنین.اگه قبول کردین من منتظر ایمیل شما هستم.

  5. Arman گفت:

    دادش دمت گرم – خیلی مفید بود مطلبت
    فقط یه چیزی تو فابل index , یادت رفته php رو بعد ?> بنویسی , البته چیز مهمی نیست :))
    بازم ممنون – خیلی کمکم کرد

    1. فؤاد طهماسبی گفت:

      ممنون ازتون، ولی این ایراد نیست. !!!
      به این میگن short_open_tag که میتونید از طریق فایل php.ini فعال یا غیر فعالش کنید.
      ولی همونطوری در مطلب “+۱۵ ترفند امنیتی برای بالا بردن امنیت برنامه PHP شما” گفته شده، کار درستی نیست که از این نوع تگ استفاده کنیم.

      ممنون که اطلاع دادید.

  6. عیل گفت:

    سلام.
    من هر کاری کردم نتونستم تو فرم ثبت نام سایتم اینو قرار بدم.
    میتونید قرار بدید ؟؟
    خواهش می کنم !
    به من ایمیل بدید :
    hrestart79@gmail.com
    یا بیایید یاهومسنجر :
    jadidnet

  7. shadi گفت:

    داخل اکشن فرمم نباید هیچی بذارم؟
    نه هیچ خطایی نمیده! انگار جوریه که وقتی متن تصویرو وارد میکنم اینتر میزنم همون صفحه دوباره اجرا میشه و یک متن تصویر جدید نشون میده

  8. shadi گفت:

    فک نمیکنم مشکل از session_start باشه . منsession_start رو ابتدای کدهای php استفاده کردم….
    ؟؟؟؟؟

    1. فؤاد طهماسبی گفت:

      هیچ خطایی نمیده؟ لاگ وب سرور رو هم نگاه کنید.

  9. shadi گفت:

    سلام
    ممنون از مطالب خوبتون
    بررسی صحتش برا من کارنمیکنه مشکل چیه؟؟؟!!!!

    1. فؤاد طهماسبی گفت:
      session_start();
      

  10. مجید گفت:

    در قسمت نحوه استفاده از تصویر امنیتی شماره ۲ که تگ img رو تو ضیح میده خاصیت src رو با جفت کوتیشن شروع کردید و در آخرش تک کوتیشن قرار دادید

    1. فؤاد طهماسبی گفت:

      ممنون، اصلاح شد.

دیدگاه‌های بیشتر

کد HTMLCSSJavaScriptPHP