54
تشکر

آموزش ساخت کپچا (تصویر امنیتی) در PHP

PHP – پی اچ پی

PHP – پی اچ پی

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

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

در ابتدا نحوه کار با توابعی که برای ایجاد تصاویر امنیتی به آن احتیاج داریم را توضیح میدهیم سپس کدها را برای شما قرار میدهیم.

در ابتدا باید یک نوشته تصادفی برای درج آن بر روی تصویر ایجاد کنیم. اینکار را توسط تابع microtime و md5 انجام میدهیم. استفاده از تابع microtime باعث میشود هر بار که نوشته تصادفی ایجاد میکنیم با دفعه پیش فرق داشته باشد.

خب حالا زمان ایجاد تصویر فرا رسیده است. ابتدا باید توسط تابع imagecreate یک تصویر ایجاد کنیم. این تابع عرض و طول تصویر را به عنوان آرگومان میگیرد.

$image = imagecreate(230, 70);

حالا که تصویر را ایجاد کردیم باید رنگ بکگراند و رنگ نوشته ها را تعیین کنیم. برای ایجاد رنگ باید از تابع imagecolorallocatealpha استفاده کنیم.

$background = imagecolorallocatealpha($image, 239, 239, 239, 1);
$textColor = imagecolorallocatealpha($image, 0, 0, 0, 1);

حالا که رنگ ها مشخص شد باید با استفاده از تابع imagettftext نوشته ها را بر روی عکس درج کرد. این تابع هشت آرگومان میگیرد.

imagettftext (image, font_size, angle, x, y, text_color, font_path, text)

اولین آرگومان تصویر را میگیرد. که همان است که قبلا با تابع imagecreate ایجاد کردیم. font_size انداره فونت را میگیرد. angle میزان چرخش متن را تعیین میکند. x و y مکان درج نوشته را معین میکند. text_color رنگ نوشته و font_path مسیر فونتی که میخواهیم در درج متن از آن استفاده شود را میگیرد. text نوشته را میگیرد.

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

برای مثال اگر بخواهیم برای نوشته سایزهای متفاوت ایجاد کنیم باید یک عدد تصادفی برای مثال بین 15 تا 35 ایجاد کنیم. که اینکار توسط تابع mt_rand ایجاد میشود.

$fontSize = mt_rand(15, 35);

بعد از اینکه کار نوشتن متن بر روی تصویر تمام شد باید نوع صفحه را تعیین کنیم. که توسط تابع header انجام میشود.

header("Content-type: application/jpeg");

سپس تصویر را باید ایجاد کنیم. و همچنین تصویر را ببندیم تا حافظه ای که به آن تعلق گرفته بود آزاد گردد.

imagejpeg($image);
imagedestroy($image);

خوب حالا عکس captcha ایجاد شد. این عکس را باید به کاربر نشان دهیم و متنی که کاربر با مشاهده کپچا میزند را با متن اصلی کپچا مقایسه کنیم. در صورت درست بودن میفهیم که یک کاربر فرم را پر کرده است.

باید ابتدا متن اصلی کپچا را درون session ذخیره کنیم. برای اینکار ابتدا باید Session را شروع کنیم که توسط تابع زیر انجام میشود.

session_start();

سپس متن را درون خانه ای به نام captcha درون Session ذخیره میکنیم.

$_SESSION['captcha'] = $captchaText;

سپس مقایسه را انجام میدهیم. برای مثال در زیر در صورت درست بودن Correct و در صورت اشتباه بودن Uncorrect چاپ میشود.

echo $_SESSION['captcha'] == $userCaptcha ? "Correct." : "Uncorrect.";

میتوانید نمونه نوشته شده را دانلود و مشاهده کنید.

  • salmani می‌گه:

    میشه کمک کرد یک کپچا در جوا اسکریپت بنویسم

  • milad ethad می‌گه:

    سلام اقا محسن
    راستی میشه بگی چجوری میره تصویر یعدی
    دگمه خاصی نداره
    میشه ؟؟؟؟؟؟
    دم شما گرم

  • sarli می‌گه:

    سلام
    محسن جان خیلی ببخشید فقط خواستم امنیت شو بررسی کنم !
    من خودم تازه سایت درست کردم
    دارم روی امنیتش کار میکنم که کاربر ایمیل نامعتبر وارد نکنه ؟
    ممنون میشم درمورد این هم ی مطلب بزاری
    سایت خوبی داری
    موفق باشی

  • احمد می‌گه:

    اقا محسن خیلی خیلی ممنونم دست گلت درد نکنه بازم ممنونم

  • احمد می‌گه:

    سلام و خسته نباشید
    من برنامه ای میخواستم که کد کپچا رو تولید کنه وبتونم او برنامه رو در نرم افزار xampp اجرا کنم ممنون میشم خیلی حیاتیه

  • web developer می‌گه:

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

  • saeed می‌گه:

    کوتاه و مختصر ومفید بود.ممنون.

  • سلام، عالی بود. متشکر آقا محسن.

  • نادر می‌گه:

    ُسلام. مطالب سایتتون خیلی خوب و آموزنده است.


  • نظرات این مطلب بسته است.