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

daskhatmin فواد طهماسبی
54,245 بازدید
کد ایجاد تصویر امنیتی ساده (کپچا) در 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);
?>

 

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

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

simplephpcaptcha.php
xsixlw.txt 
ldsans.ttf

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

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

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

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

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

<?
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
Download “کد ایجاد تصویر امنیتی ساده (کپچا) در PHP”
نسخه 2.0.0 683 بار دانلود شده است 33 KB

daskhatmin

فواد طهماسبی

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

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

  1. رضا واحدی گفت:

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

  2. یوسف گفت:

    سلام و ارادت
    آقا من این کد رو توی صفحه‌ی ورود سایتم که با وردپرس و ووکامرس هست گذاشتم، البته بگم که کد رو تو صفحه‌ی ورودی که توی قالبم هست گذاشتم نه صفحه‌ی ورود خود وردپرس اما به مشکل برخوردم.
    ابتدا به این عکس یک نگاهی بنداز:
    http://uupload.ir/files/e5c_screen_shot_1397-02-31_at_15.56.52.png

    ۱- این فرم ورود هستش و قرار هست که وقتی کاربر متن عکس رو درست وارد کرد بتونه لاگین بکنه که این قابلیت وجود نداره و کد شما دوتا پیغام مبنی بر درست یا نادرست بودن تصویر چاپ می‌کنه، اول اگر امکانش هست لطف کنید راهنمایی کنید که چطوری باید این قابلیت رو به کُد اضافه کرد.
    ۲- اون پیغام اون زیر مربوط به دستر شرطی if هست که هرکاری کردم از بین نرفت.

    اگر بتونید راهنمایی کنید این میشه یک کد برای اینکه اپراتور بخاد راستی آزمایی بکنه نیازی نباشه پلاگین نصب بکنه برای کپچا، توی هیچ سایت فارسی هم مشابه این وجود نداره و همه پلاگین معرفی کردن برای وردپرس و ووکامرس.
    ممنون میشم راهنماییم کنید چون ربات‌ها میان ثبت‌نام میکنن تو سایتم و ترافیک سایتمو بیخود می‌گیرند و نمی‌خام هم از پلاگین استفاده بکنم.
    متشکرم از شما

    1. سلام،
      این فرم برای پروژه های php در نظر گرفته شده و برای وردپرس بهینه نیست و نیاز داره کمی با هوک‌های وردپرس آشنایی داشته باشید.

      برای درج این کپچا در فرم ورود وردپرس از فیلترهای login_form_middle و login_form استفاده کنید و برای سنجش درستی از فیلتر wp_authenticate_user استفاده کنید.

      اگر به درستی پیاده سازی بشه ایرادی نداره و میشه ازش در وردپرس هم استفاده کرد.

  3. محمد گفت:

    سلام
    الان کپچا تو صفحه login نمایش داده میشه ولی یه مشکلی داره
    وقتی که if رو کنار username & pass تعریف میکنم که به سرور ارسال بشه و صحتش تایید بشه
    کلا دستور …… if ($_SESSION رو نمیخونه مستقیم میره سر else و پیام میده که Captcha Isn’t Correct
    دستور if هم که بردارم مشخصه هر چی توی fild نوشته بشه رو قبول میکنه

    نمیدونم مشکل از کجاس میتونید راهنمایی کنید ؟

    1. سلام،
      تکه کد مورد نظر رو اینجا ارسال کنید شاید بتونم راهنمایی کنم.

      1. محمد گفت:
        if (isset($_POST["Login"])){ 
        session_start();
           if ($_SESSION["captcha"] == $_POST["captcha"]){
        	 $user = $_POST["user"];
                 $password = $_POST["Password"];
           
            
                $params = array("Command" => "AccountsPassword", "user" => $user, "PW" => $password);
                $api = site_API($params);
                if ($api->Result != "Ok") {
                    $message=$api->Error;
                }elseif ($api->Verified != "Yes") {
                    $message="Password is incorrect";
                } elseif ($api->Result != "Ok") {
                            $message=$api->Error;
                } else {
                  $_SESSION["name"]=$user;
                  $_SESSION["password"]=  $password;
                  $params = array("Command" => "AccountsGet", "user" => $user);
                  $api = site_API($params);
                  $_SESSION["points"]= $api->points;
                  $_SESSION["avatar"] = $api->Avatar;
                  $_SESSION["gender"] = $api->Gender;
                  header("Location: index.php");
                  }
            }
             else {
                      $message="Captcha Isn't Correct";
                }   
        }
        
      2. سلام مجدد،

        محتویات $_SESSION["captcha"] و $_POST["captcha"] رو اکو کنید باهم مقایسه کنید ببینید محتویات دو متغیر چه فرقی باهم دارن.

        همراه فایل یک فایل پیاده سازی شده php هم هست از اون میتونید کمک بگیرید.

      3. محمد گفت:

        session ijad nemikne aslan ke moghayese kone

      4. session_start(); رو ببرید بیرون و بالاتر از همه شرطها.

        ارور ریپورتینگ رو هم فعال کنید.

           
        <?php
        error_reporting(E_ALL);
        session_start();
         

        ممنون میشم فارسی بنویسید 🙂

    2. محمد گفت:

      اوکی شد
      من واسه سشن هام اسم خاص تعریف کرده بودم کد شمارو تغییر دادم اوکی شد

      1. خواهش میکنم، موفق باشید

  4. محمد گفت:

    سلام دستتون درد نکنه خیلی عالیه این پست

    من یه مشکلی دارم اونم اینه که وقتی if رو تو کد نویسی میذارم صحت کد رو بررسی نمیکنه مستقیم میره روی else و پیام Captcha Isn’t Correct رو میده
    و وقتی هم که if رو برمیدارم کپچا رو نشون میده ولی مهم نیست چی مینویسی تو فیلد هرچی باشه قبول میکنه و login میشه
    مشکل کجاست من درک نمیکنه

  5. سجاد گفت:

    سلام
    برای من این ارور رو میدهWarning: imagettftext(): Could not find/open font
    و توی عکس اصلا حروف نمیاد

    1. سلام
      باید کتابخانه php-gd رو نصب کنید و در فایل php.ini باید فعال باشه.

      1. سجاد گفت:

        من از لوکال هاست استفاده میکنم و پروژه دانشگاهی هستش.
        لوکال هاست هم میشه کتابخانه نصب کرد؟

      2. در فولدر مربوط به php در فایل php.ini سطر extension=php_gd2.dll رو از کامنت در بیارید. (علامت ; رو از اولش پاک کنید) و آپاچی رو ری استرات کنید.

  6. مهسا باقری گفت:

    سلام
    من یه مشکلی که دارم این که تصویر کد نشون داده نمیشه در موبایل وسیستم فرقی هم نداره…
    جای تصویر کد این متن رو نشون میده
    V1 SHUTDOWN ON 31-3-2108
    ممنون میشم راهنمایی کنید…توی ثبت نام هر سایتی به مشکل خوردم

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

  7. زهرا يونسي گفت:

    با تشکر از مطالب خوب سایت تون

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

    چند روزی هست که من و شاگردانم نمیتونیم وارد سایت بشیم . میگن باید روی فرم های سایت کد کپچا بزاریم تا سایت باز بشه . شما میتونین ما رو راهنمایی کنین ؟ ممنونم

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

  9. ارمان گفت:

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

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

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

  11. sahar گفت:

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

  12. Arman گفت:

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

  13. عیل گفت:

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

  14. shadi گفت:

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

  15. shadi گفت:

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

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

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

  16. shadi گفت:

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

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

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

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

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

  18. sadegh گفت:

    سلام،
    این کدها رو کجا بنویسم؟
    نیاز هست جدولی ایجاد کنم تو دیتابیسم واسشون؟

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

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

  19. omid گفت:

    سلام واقعا ممنون از زحمتی که میکشید (بدون تعارف)

    کد تصویر امنیتی قوی

    من شدیدا نیاز به تصویر امنیتی دارم که از لحاظ امنیت کامل باشه و نشه دورش زد چون امنیت مهم هست کد تصویری مثل گوگل هست اما من میخوام از کدی استفاده کنم که سورسش رو به اصطلاح ببینم و هر طور بخوام ویرایش کنمش، نمونه از ویرایش در زیر اورده شده

    اگه ممکنه کد رو به صورت عددی و تا 5 حرف و فقط رندمی از اعداد باشه بنویسید و اشاره کنید کجا تعداد حروف تصویر امنیتی رو مشخص کنیم

    در اخر باز هم خواهش میکنم درصد امنیت این کد تون رو بگید چقدر امکان دور زدنش وجود داره
    و اگه ممکن هست توضیح همین کد هایی که نوشتید رو به صورت خط به خط بیان کنید مثلا جلو هر خط کامنت بزارید کارش رو

    منتظر جواب تون میمونم تا از این کد در پروژه ام استفاده کنم

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

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

  20. Azad گفت:

    سلام..من علاقه ی زیادی ب Php دارم خ خوب هم یاد گرفتم..فقط کد امنیتیشو بلد نیستم اونم اومدم اینجا گذاشته بودین..ازتون ممنونم.. برم ببینم ب دردم میخور..باز میام بهتون سر میزنم..ممنون

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

*اگر پرسشی دارید که مربوط به این مطلب نیست لطفا در بخش پرسشها مطرح کنید. در غیر این صورت دیدگاه شما تایید نخواهد شد.


کد HTMLCSSJavaScriptPHP