ساخت کپچا در php (کد امنیتی)

  • آپدیت شده در تاریخ

ساخت کپچا در php

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

در این اسکریپت اول از همه یک شماره کاملا تصادفی (random) تولید و سپس از خروجی یک عکس می سازیم . اگر کاربر فرم را با مقدار درست کپچا – captcha ارسال کرد ، بقیه مراحل مثل insert کردن داده ها داخل دیتابیس یا ارسال ایمیل و…. انجام میدیم

 

قدم اول : ساخت یک صفحه HTML

کد زیر شامل یک ورودی اسم ، ایمیل و کپچا با دکمه submit است . این کد ها را در فایل index.php ذخیره میکنیم.

قدم دوم : ساخت کد کپچا

یک فایل captcha.php ایجاد و داخل بلاک php تابع session_start() را فراخوانی می کنیم.بعد با تابع rand() یک مقدار عدید ایجاد و داخل متغییر سئشن ذخیره میکنیم .

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

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

تعریف اندازه تصویر کپچا و همچنین اندازه فونت

تعریف content type فایل captcha.php به صورت عکس

ساخت کپچا در php با اندازه و رنگ پس زمینه دلخواه

تعیین رنگ متن کپچا به صورت rgb

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

قدم سوم : نمایش کد امنیتی (captcha) در فرم

در قدم اول آموزشمان ، ما فیلد های مربوط به کپچا را اضافه کردیم . برای نمایش کپچا از تگ img و قرار دادن مقدار captcha.php در مشخصه src استفاده می کنیم.

ساخت کپچا در php (کد امنیتی)

قدم چهارم : بررسی کپچا بعد از ارسال فرم

حالا باید کد کپچا ارسال شده را چک کنیم . اگر مقدار ارسال شده با مقداری که در سئشن ذخیره شده یکسان بود مقدار true و اگر اشتباه بود مقدار false را داخل شرطمان بر میگردانیم

امیدوارم از آمورش ساخت کپچا در php (کد امنیتی) استفاده برده باشید و در پروژه هایی که می نویسید بخصوص در قسمت صفحات لاگین برای جلوگیری از حملات brute-force و در صفحه نظرات برای پیشگیری از اسپم شدن از این مکانیزم استفاده کنید.

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

برای دریافت سورس این پروژه لطفا از باکس دانلود پایین این بخش استفاده کنید .

موفق و پیروز باشید.

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

آموزش های رایگان بیشتر در اینستاگرام ما ...

NETPARADIS /
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۵۴)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. محمد طاها ۲۲ شهریور ۱۳۹۹

    با سلام و خسته نباشید خدمت شما سایت نت پارادیس من هم شبیه اکثر دوستان در قسمت نمایش کد مشکل داشتم ولی با استفاده از راهنمایی های افرادی که همین مشکل را داشتند درست شد با تشکر

    پاسخ
    1. حسن شفیعی ۲۲ شهریور ۱۳۹۹

      سلام. ممنون و خوشحالیم که مفید واقع شد.
      موفق باشید.

      پاسخ
  2. Ehsan ۳۱ مرداد ۱۳۹۹

    سلام.راهی هست این عکس کپچا داخل دایرکتوری ذخیره بشه؟

    پاسخ
    1. حسن شفیعی ۳۱ مرداد ۱۳۹۹

      سلام. برای ذخیره در اینجا به جای
      imagejpeg($image);
      از file_put_contents(‘file.jpg’,$image) برای ذخیره استفاده کنید.

      پاسخ
  3. محمد ۱۰ تیر ۱۳۹۹

    سلام خسته باشید ببخشید برای من عکس رو میاره ولی روی عکس چیزی نمی نویسه یعنی عکس فقط سفیده و وقتی رنگ بک گراند رو عوض می کنم رنگ عکس تغییر می کنه ولی اصلا اثری از نوشته نیست لطفا راهنماییم کنید.

    پاسخ
    1. حسن شفیعی ۱۰ تیر ۱۳۹۹

      سلام. ممنون.
      باید توجه داشته باشید که از چه ورژن php استفاده می کنید که روی ۵٫۶ تست شده و همچنین سورس کدنهایی رو دانلود و استفاده کنید.
      همچنین از فعال بودن gd در هاست مطمین باشید.

      پاسخ
  4. شاهین اکبری ۱۸ خرداد ۱۳۹۹

    دوستانی که با آدرس تصویر مشکل دارن یا تصویر لود نمیشه براشون از روس زیر آردس دهی کنند.
    $font = dirname(__FILE__) . ‘/fontname.ttf’;

    پاسخ
  5. Gholami ۸ خرداد ۱۳۹۹

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

    پاسخ
    1. حسن شفیعی ۸ خرداد ۱۳۹۹

      سلام. داخل هر صفحه ای که نیاز است مثلا فرم ثبت نام یا فراموشی رمز این رو مطابق آموزش اضافه کنید. مثلا تو این آموزش ما خودمان اومدیم یک فرم مثالی ایجاد کردیم که input با name=captcha داره. و کد های php رو هم میتونید داخل یک فایل captcha.php بزارید و کد مربوط به جی کویری هم در همان صفحه ای که فرم قرار دارید بزارید تا درخواست ajax بدرستی ارسال بشه

      پاسخ
  6. علی اصغر ولیلو ۱۶ اردیبهشت ۱۳۹۹

    عشقید بخدا این آموزش های رایگان شما میلیون ها قیمت داره
    خیلی خیلی ممنون

    پاسخ
    1. حسن شفیعی ۱۶ اردیبهشت ۱۳۹۹

      ممنونم. خیلی خوشحالیم که مفید واقع شده.
      موفق و پیروز باشید.

      پاسخ
  7. شهریار ۲۲ خرداد ۱۳۹۸

    سلام. خصوصیت alt به عکس چجوری میشه اضافه کرد؟ ممنون

    پاسخ
    1. حسن شفیعی ۲۲ خرداد ۱۳۹۸

      سلام. این آموزش رو مطالعه کنید :
      آموزش HTML – تصاویر در HTML
      موفق باشید.

      پاسخ
  8. عماد برزگر ۸ خرداد ۱۳۹۸

    این ارور رو هم میده
    imagettftext(): Could not find/open font in C:\wamp64\www\t\s.php on line 13

    پاسخ
    1. حسن شفیعی ۸ خرداد ۱۳۹۸

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

      پاسخ
  9. عماد برزگر ۸ خرداد ۱۳۹۸

    سلام من وقتی کار رو انجام میدم با ارور زیر مواجه میشم
    gd-jpeg v1.0 (using IJG JPEG v90), default quality

    پاسخ
  10. سید منوچهر شهیدی ۱۲ فروردین ۱۳۹۸

    دوستانی که کد براشون اجرا نمیشه دقت کنید من راهشو یاد گرفتم.اولندش که اون تابع header رو اصلا نممیخواد بزارید.اگه بزارید کار نمیکنه.
    دومندش اون متغیر $font رو به صورت زیر بنویسید:
    $font = __DIR__ . ‘/font.ttf’;
    اون font.ttf هم که فونت من هست.
    تمام شد و رفت.

    پاسخ
    1. محمدرضا ۲ فروردین ۱۳۹۹

      دمت گرم واقعا عالی بود

      پاسخ
      1. حسن شفیعی ۲ فروردین ۱۳۹۹

        سلام. خوشحالیم که مفید واقع شده.
        موفق و پیروز باشید.

        پاسخ
  11. سید منوچهر شهیدی ۱۰ فروردین ۱۳۹۸

    سلام.ببخشید لطفا کدی رو که باید توی فایل aptcha.php بزاریم رو به صورت کامل و متوالی بزارید.ممنون.

    پاسخ
    1. حسن شفیعی ۱۰ فروردین ۱۳۹۸

      سلام. کد کامل از بخش باکس دانلود قابل دانلود و استفاده است.
      موفق باشید.

      پاسخ
  12. علی کوزادی ۷ آذر ۱۳۹۷

    آقا من اینم که گفتید اضافه کردم ولی باز تصویرنمیاد!
    چیکار کنم به نظرتون؟

    پاسخ
    1. حسن شفیعی ۷ آذر ۱۳۹۷

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

      پاسخ
  13. علی کوزادی ۶ آذر ۱۳۹۷

    gd2 رو چجوری میتونم فعال کنم؟

    پاسخ
    1. حسن شفیعی ۷ آذر ۱۳۹۷

      سلام. در هاست اشتراکی شما دسترسی اینکار رو ندارید و باید تیکت بزنید به هاستینگ تا بررسی کنند
      در سرور شخصی و یا لوکال هاست میتوانید فایل php.ini را ویرایش و خط زیر را extension=php_gd2.dll اضافه و وب سرور را ریستارت کنید.
      موفق باشید.

      پاسخ
  14. نعیم ۲۳ مهر ۱۳۹۷

    خط content type را در کد ها پاک کردم مشکل حل شد.

    پاسخ
    1. حسن شفیعی ۲۳ مهر ۱۳۹۷

      خیلی هم عالی . موفق باشید.

      پاسخ
  15. نعیم ۲۳ مهر ۱۳۹۷

    وقتی https فعال باشه در کروم و اپرا نمایش داده نمیشه کپچا ولی در موزیلا بدون مشکل هست.

    پاسخ
  16. نعیم ۲۳ مهر ۱۳۹۷

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

    پاسخ
    1. حسن شفیعی ۲۳ مهر ۱۳۹۷

      سلام. مجددا چک شد. مشکلی نداره در هر دو مرورگر درست نمایش داده میشه.
      موفق باشید.

      پاسخ
  17. علی ۲۲ مرداد ۱۳۹۷

    سلام وقت شما بخیر جا داره از آموزش خوبتون تشکر کنم ممنون وسپاس فراوان
    من تمام کارها رو انجام دادم و تصویر امنیتی رو ساختم حالا میخوام با دکمه رفرش این تصویر رو به صورت ایجکس تغییر بدم که به جای تصویر کارکترها ایجاد میشه
    این کدهای من
    ….
    imagestring($im, 5, 30, 15, $code, $fg);
    for ($i=0;$i+�A9�Ci�J<(�/�DԴQ
    ….
    ممنون میشم راهنمایی کنید

    پاسخ
    1. حسن شفیعی ۲۲ مرداد ۱۳۹۷

      سلام . خوشحالم که مفید واقع شده . شما باید آدرس فایل captcha.php را به مقدار src در تگ img بدید تا فراخوانی بشه .
      موفق باشید.

      پاسخ
  18. محمدرضا اکبرپور ۱۹ مرداد ۱۳۹۷

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

    پاسخ
    1. حسن شفیعی ۱۹ مرداد ۱۳۹۷

      سلام . مشکلی نداره روی لوکال تست شده و مشکل از سیستم شماست و احتمالا توابع image* براتون اجرا نمیشن . موفق باشید.

      پاسخ
      1. محمدرضا اکبرپور ۱۹ مرداد ۱۳۹۷

        سلام
        کلا تصویر که میسازم با php ارور میده خواهش میکنم کمک کنید تا شکل رو رفع کنم این توابع image کجا قرار داره

        The image http://127.0.0.1/ cannot be displayed because it contains errors

        پاسخ
      2. حسن شفیعی ۱۹ مرداد ۱۳۹۷

        سلام. خب دوست عزیز شما این خط header(“Content/text:image/png”); در فایل Captcha.php کامنت کنید و دوباره این فایل رو از مرورگر باز کنید ببینید جه اروری داره . اون ارور رو در گوگل جستجو ومشکل رو حل کنید . که خب مشکل میتونه از فعال نبود اکستنشن gd2 هم باشه که باید از php.ini فعال و بعد وب سرور را یکبار ریستارت کنید.

        پاسخ
  19. نوید ۱۸ مرداد ۱۳۹۷

    با سلام
    من از xamp استفاده میکنم، کد رو که اجرا کردم ،تصویر نمایش داده نشد.
    extension=php_gd2.dll رو هم در php.ini فعال کردم.
    مشکلش چیه؟
    ممنون

    پاسخ
    1. حسن شفیعی ۱۸ مرداد ۱۳۹۷

      سلام . بازم تست شد و مشکلی نداره .
      ساخت کپچا در php (کد امنیتی)
      بهتره فایل captcha.php را یکبار از url باز و تست کنید.
      مشکل مطمینا از سمت لوکال هاست شماست. ورژن php تست شده هم ۵٫۶ است.

      موفق باشید.

      پاسخ
  20. مریم ۲۶ اسفند ۱۳۹۶

    با سلام

    برای ساخت کپچا غیر حساس به حروف چه باید کرد؟

    پاسخ
    1. حسن شفیعی ۲۶ اسفند ۱۳۹۶

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

      strcasecmp("Netparadis","NETPARADIS");

      موفق باشید

      پاسخ
  21. arman rj ۲۴ اسفند ۱۳۹۶

    با سلام و خسته نباشید
    ببخشید وقتی اجرا کردم این کد رو
    captcha.php
    از همون اول لود نمیشه که بتونم کد رو وارد کنم

    پاسخ
    1. حسن شفیعی ۲۴ اسفند ۱۳۹۶

      سلام ممنونم . ببینید این فایل captcha.php یک عکس تولیذ میکنه که برای اینکه مرورگر اون رو به عنوان عکس بشناسه به اول کد header(“Content/text:image/png”);
      رو اضافه کردیم و همچنین قرار نیست به صورت عادی چیزی ببینید باید اون رو داخل یک تگ img و ویژگی src فراخوانی کنید.

      موفق باشید.

      پاسخ
  22. محمد ۱۶ آذر ۱۳۹۶

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

    پاسخ
    1. حسن شفیعی ۱۷ آذر ۱۳۹۶

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

      کد کامل

      capimg کلاس تگ img که کپچا رو نشون میده است .

      موفق باشید

      پاسخ
      1. صالح ۱۲ مهر ۱۳۹۸

        سلام و خسته نباشید . من همین دستورات ajax رو برای رفرش کردن نوشتم.ولی فقط یک بار تصویر عوض می شه و بعد فقط عدد تصادفی در پشت صحنه عوض می شه و تصویر عوض نمیشه.نظرتون چیه ؟

        پاسخ
      2. حسن شفیعی ۱۲ مهر ۱۳۹۸

        سلام. ممنون.
        تا کد شما رو نبینم نمیشه قطعی نظر داد مشکل از کجاست.
        لطفا سورس کد نهایی را از باکس دانلود, دریافت کنید و مستقیما اجرا کنید تا با مقایسه هر دو نتیجه رو ببینید.
        همچنین در این موارد بهتر است که بخش console و network مرورگر رو هم چک کنید.

        پاسخ
      3. صالح ۱۲ مهر ۱۳۹۸

        من نتیجه رو تو console .log نگاه کردم ی سری علامت های نامفهوم چاپ می کنه.ی سوال ؟
        attr(‘src’, ‘img/’+msg + ‘.png’)
        این دایرکتوری img چیه نوشتید ؟

        پاسخ
      4. حسن شفیعی ۱۲ مهر ۱۳۹۸

        تصاویر کپچای ساخته شده داخل این فولدر ذخیره می شوند که بهتره این فولدر رو در ریشه فایل captcha.php داشته باشید.

        پاسخ
      5. صالح ۱۲ مهر ۱۳۹۸

        ببخشید منظور از img/ چیه ؟
        attr(‘src’, ‘img/’+msg + ‘.png’)

        پاسخ
      6. حسن شفیعی ۱۲ مهر ۱۳۹۸

        این خط
        attr(‘src’, ‘img/’+msg + ‘.png’)
        در هنگام اجرای ajax تصویر ساخته شده در فولدر مورد نظر را به جای تصویر فعلی قرار می دهد تا کد کپچای جدید برای کاربر قابل رویت باشد.

        پاسخ
      7. صالح ۱۲ مهر ۱۳۹۸

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

        الان دستور imagepng دو تا پارامتر داره یکی سورس تصویری که می خوایم درست کنیم و پارامتر دوم که میشه آدرس ساخت فایل فیزیکی.
        الان تو دستورات شما پارامتر دوم اصلا ذکر نشده.
        ممنون میشم راهنمایی کنید.

        پاسخ
      8. حسن شفیعی ۱۵ مهر ۱۳۹۸

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

        پاسخ
      9. reza_aram ۱۳ مهر ۱۳۹۸

        سلام و خسته نباشید.می خواستم بگم که فایا های سورس شما اصلا تگی با کلاس capimg ندارد و من وقتی درخواست رفرش می فرستم. در قسمت src تگ img این چاپ می شود :

        h&ŚZ���|�(
        ��g���I/T�۲Fi$RU��=�iE�O?9�sU�k�ʉ���۴aj��+O#
        ‘>9�۸�*D:�j/���jkS������C-~��㗣�_�ڂUFf�h�b��j��P�}�[f����IEND�B`�”>ببخشید علتش چیه

        پاسخ
      10. حسن شفیعی ۱۵ مهر ۱۳۹۸

        سلام. ممنون.
        قرار هم نبود این مورد وجود داشته باشه چون در این مطلب و سورس کد مورد نظر حرفی از ajax نشده و فقط به عنوان راهنمایی در پاسخ کامنت دوستان ارسال کردیم.
        این محتوایی که برگشت داده شده کد raw تصویر است و برای نمایش تصویر باید هدر نمایش تصویر رو در مرورگر ارسال کنید که به اینصورت باید به ابتدای کد php خودتون که مربوط به تولید تصویر کپچا است اضافه کنید :
        header(“Content/text:image/png”);

        پاسخ
دوره های آموزشی

دانلود رایگان کتاب آموزش PHP

صفر تا صد PHP و MySQL را یکجا یاد بگیرید
همین الان دانلود کن
نگران نباشید. ایمیل‌های مزاحم نمی‌فرستیم
close-link