آموزش ساخت تصویر امنیتی یا captcha در php

1396/9/14 علیرضا حاتمی نیا 330

خدمت شما کاربر محترم وبسایت ILikePHP سلام عرض می کنم. با آموزش ویژه دیگری از سری آموزش های برنامه نویسی تحت عنوان آموزش ساخت تصویر امنیتی یا Captcha با php در خدمت شما هستم.

تصویر امنیتی یا کپچا به چه منظور ساخته میشود؟

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

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

در این آموزش لازم است تا با مفاهیم زیر تا حدودی آشنا باشید:

  • آموزش HTML
  • آموزش PHP

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

ساخت تصویر امنیتی در php

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

<form action="final.php" method="post">
    <label>captcha:</label>
    <input type="text" name="captcha"> <br>
    <img src="" alt=""captcha> <br>
    <input type="submit">
</form>

بسیار خب. اگر دقت کنید یک تگ <img> نیز در این فرم وجود دارد که قرار است تصویر امنیتی که توسط سیستم با هر بار بارگذاری صفحه تولید می شود را نمایش دهد.

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

در فایلی به نام captcha.php این تصویر را تولید می کنیم. این تصویر دارای 6 حرف از a-z و A-Z و اعداد 0-9 می باشد که به صورت تصادفی این کاراکتر ها ساخته می شود. 
برای تولید 6 رشته تصادفی از حروف یاد شده این گونهعمل می کنیم.

$string = "ABCDEFGHIJKLMNOPQRSTWXYZ0123456789abcdefghigklmnopqrstwxyz";
$string = substr(str_shuffle($string),0,6);
$_SESSION['captcha'] = $string;

توجه داشته باشید که متغیر $string شامل کلیه حروف و اعدادی است که قرار است از این حروف 6 کاراکتر تصادفی انتخاب کنیم. برای این کار از تابع str_shuffle در php استفاده می کنیم. این تابع رشته مورد نظر را مخلوط و رشته ای تصادفی از همین کاراکتر ها را بر می گرداند. بعد از ارائه رشته تصادفی توسط تابع substr از مکان شماره 0 یعنی اولین رشته تا مکان شماره 6 تعداد 6 رشته را جدا می کنیم. سپس یک session با نام captcha می سازیم و مقدار متغیر $string را برابر آن قرار می دهیم تا در آخر متن وارد شده توسط کاربر با آن مقایسه شود.

سپس توسط کد زیر نوع فایل  captcha.php را از نوع تصویر و فرمت آن را jpeg تعیین می کنیم. 
 

header('Content-type: image/jpeg');

حال متغیر های اندازه طول و عرض تصویر و اندازه فونت کاراکتر ها را تولید می کنیم :
 

$width = 200;
$height = 100;
$font_size = 35;

سپس نوبت به تولید بک گراند تصویر امنیتی می رسد که اینگونه آن را می سازیم :

$image = imagecreate($width,$height);
imagecolorallocate($image,0,0,0);

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

$text_color = imagecolorallocate($image,255,255,255);
imagettftext($image,$font_size,10,20,75,$text_color,'font.ttf',$string);

توجه داشته باشید که تابع imagettftext یک متن با فونت ttf روی تصویر مورد نظر ایجاد می کند. اعداد 10، 20 و 75  به ترتیب زاویه چرخش متن، فاصله متن از محور x و فاصله متن از محور y را تعیین می کنند. font.ttf نیز نام فونت مورد نظر با فرمت ttf می باشد.
و در نهایت تصویر امنیتی را تولید میکنیم. 

 

imagejpeg($image);

حال کافیست تا آدرس تصویر ساخته شده را در تگ <img> واقعدر فرم فایل form.php وارد کنیم:
 

<img src="captcha.php" alt="captcha">

در فرم final.php نیز مقدار عبارت وارد شده توسط کاربر را با session[‘captcha’] مقایسه می کنیم تا صحت آن بررسی شود : 

session_start();
if ($_POST['captcha'] == $_SESSION['captcha']) {

    echo "Dorost ast";
} else {
    echo "Na Dorost ast";
}