php و لاراول از جمله پراستفادهترین زبانها و فریمورکهای موجود در فضای وب و توسعه سایتهای اینترنتی هستند. و کپچا یک سرویس لازم برای افزایش امنیت فرمها و صفحات وبسایتها است. در این مقاله آموزش نصب و استفاده از کپچا در php و لاراول را قدم به قدم به شما توضیح میدهیم و نمونه کدی را در اختیارتان قرار خواهیم داد.
کپچا مهمترین و موثرترین راهکار برای جلوگیری از آسیبهای ناشی از حملات باتهای اینترنتی است.
استفاده از کپچا، مستقل از زبان برنامهنویسی و تکنولوژی شامل دو مرحله است:
۱. قرار دادن کد جاوااسکریپت و HTML در فرم مورد نظر در سمت کاربر
۲. تایید جواب کاربر با ارسال درخواست verify (با استفاده از یک کلاینت http) به سرور کپچا، برای اطمینان از درست حل شدن چالش
در سه مرحله میتوانید کپچا را برای وبسایت کدنویسی شده با لاراول، فعال کنید. پکیج کپچا را نصب و تنظیم کنید، ویجت را سمت کاربر اضافه کنید و تایید سمت سرور را پیادهسازی کنید.
برای استفاده از کپچا در لاراول، ابتدا باید پکیج لاراول آرکپچا را با استفاده از composer دانلود کنید.
composer require arcaptcha/arcaptcha-laravel
سپس در فایل app/config.php کلاسهای مربوطه را به قسمت providers و aliases اضافه کنید.
'providers' => [
...
Mohammadv184\ArCaptcha\Laravel\ArCaptchaServiceProvider::class,
];
'aliases' => [
...
'ArCaptcha' => Mohammadv184\ArCaptcha\Laravel\Facade\ArCaptcha::class,
];
با اجرای دستور زیر میتوانید فایل تنظیمات آرکپچا در آدرس config/arcaptcha.php را ایجاد کنید:
php artisan vendor:publish --provider="Mohammadv184\ArCaptcha\Laravel\ArCaptchaServiceProvider"
برای کار کردن کپچا باید حتما در فایل .env خود مقادیر ARCAPTCHA_SITE_KEY و ARCAPTCHA_SECRET_KEY را با مقادیری که موقع ثبت وبسایت دریافت کردهاید پر کنید.
# in your .env file
ARCAPTCHA_SITE_KEY=YOUR_API_SITE_KEY
ARCAPTCHA_SECRET_KEY=YOUR_API_SECRET_KEY
برای استفاده از کپچا در سمت front-end در صورتی که از فایلهای blade استفاده میکنید میتوانید کد js مربوطه را به صورت زیر به صفحه خود اضافه کنید:
<!DOCTYPE html>
<html>
<head>
...
@arcaptchaScript
</head>
در مثال پایین یک فرم ساده را مشاهده میکنید که شامل csrf-token و ویجت آرکپچا و یک دکمه ثبت است. شما میتوانید المان ویجت را با استفاده از @arcaptchaWidget به صفحه خود اضافه کنید :
<form>
@csrf
...
@arcaptchaWidget
<!-- OR -->
{!! ArCaptcha::getWidget() !!}
<input type="submit">
</form>
دقت داشته باشید که دو مثال بالا صرفا برای استفاده در فایل های blade میباشند. در صورتی که شما از VueJs یا سایر فریمورکهای فرانتاندی استفاده میکنید میتوانید از کتابخانههای آماده آرکپچا استفاده کنید. یا خودتان به صورت دستی با استفاده از صفحه راهنما اقدام به پیادهسازی کنید.
کاربر شما فرمی که در آن ویجت آرکپچا قرار دارد را ثبت میکند. و به همراه سایر فیلدها یک فیلد با نام arcaptcha-token از طریق آن برای شما ارسال میشود.
در این مرحله باید از حل شدن درست چالش اطمینان حاصل کنید. به این منظور هنگامی که قصد اعتبارسنجی ورودیهای کاربر خود را دارید، میتوانید همانند مثال زیر از قانون (Rule) تعریف شده با عنوان arcaptcha برای اعتبارسنجی استفاده کنید.
$validator = Validator::make(request()->all(), [
...
'arcaptcha-token' => 'arcaptcha',
]);
// check if validator fails
if($validator->fails()) {
...
$errors = $validator->errors();
}
میتوانید برای درک بهتر جزئیات استفاده از کپچا در لاراول به این صفحه مراجعه کنید و نمونه کد را ببینید.
در این بخش، آموزش استفاده از کپچا در php خام را توضیح میدهیم. این آموزش بر اساس اینکه از composer استفاده میکنید یا نه، متفاوت است.
ابتدا این کلاس را دانلود کنید. فایلی با اسم ArCaptcha.php در پروژه خود ایجاد کنید و محتویات دانلود شده را در آن قرار دهید. سپس در جایی که فرم شما ساخته می شود کلاس را require کنید. یک نمونه از این کلاس مانند مثال زیر بسازید. دقت کنید که بجای ورودیهای SITE_KEY و SECRET_KEY باید مقادیری که در هنگام ثبت وبسایت جدید در سایت آرکپچا دریافت کردهاید را قرار دهید.
require './ArCaptcha.php';
$ArCaptcha = new ArCaptcha('SITE_KEY', 'SECRET_KEY');
بعد از ساختن شی، با استفاده از توابع getScript و getWidget کد Javascript و HTML را در صفحه موردنظر ایجاد کنید.
<!DOCTYPE html>
<head></head>
<body>
<?php echo $ArCaptcha->getScript()?>
<form method="POST">
<?php echo $ArCaptcha->getWidget()?>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
در این مرحله ویجت آرکپچا برای کاربران در صفحه یا فرم مورد نظر شما نمایش داده خواهدشد. کاربر پس از حل کردن ویجت و پرکردن سایر فیلدهای فرم شما روی دکمه ثبت یا ارسال کلیک کرده و یک درخواست POST به سمت سرور شما میفرستد. یکی از فیلدهایی که همراه فرم ثبت میشود فیلدی با نام arcaptcha-token است.
در این مرحله شما باید مقدار arcaptcha-token را بخوانید و درخواست verify را به سمت سرور آرکپچا ارسال کنید. برای انجام اینکار می توانید از کلاسی که در مرحله قبل ساختیم استفاده کنید. به این منظور میتوانید تابع verify را با ورودی arcaptcha-token فراخوانی کنید :
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($ArCaptcha->verify($_POST["arcaptcha-token"])) {
echo "OK!";
} else {
echo "FAILED!";
}
}
در صورتی که تابع verify مقدار true را برگرداند به این معناست که کاربر چالش را کامل و درست حل کرده است. در غیر این صورت حل چالش با مشکل مواجه شده و شما باید به تبع آن کاربر را از این امر مطلع سازید.
همچنین میتوانید برای درک بهتر نحوه استفاده از کپچا در پیاچپی بدون composer به این صفحه مراجعه کنید و نمونه کد را ببینید.
استفاده از کپچا با وجود composer راحتتر از مرحله قبل است. تفاوتی که با مرحله قبل دارد این است که دیگر لازم نیست چیزی را به صورت دستی دانلود کنید. و مدیریت پکیجها را به composer خواهید سپرد. برای شروع ابتدا پکیج مربوط به آرکپچا را با استفاده از composer دانلود کنید.
composer require arcaptcha/arcaptcha-php
سپس همانند قسمت قبل سعی کنید کلاس مربوطه را use کنید و یه نمونه از کلاس ArCaptcha بسازید.
use Mohammadv184\ArCaptcha\ArCaptcha;
$ArCaptcha = new ArCaptcha('SITE_KEY', 'SECRET_KEY');
دقت کنید که به جای ورودی های SITE_KEY و SECRET_KEY باید مقادیری که در هنگام ثبت وبسایت جدید در سایت آرکپچا دریافت کردهاید را قراردهید. بعد از ساختن شی، با استفاده از توابع getScript و getWidget کد Javascript و HTML را در صفحه مورد نظر ایجاد کنید.
<!DOCTYPE html>
<head></head>
<body>
<?php echo $ArCaptcha->getScript()?>
<form method="POST">
<?php echo $ArCaptcha->getWidget()?>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
در این مرحله ویجت آرکپچا برای کاربران در صفحه یا فرم مورد نظر شما نمایش دادهخواهدشد. کاربر پس از حل کردن ویجت و پر کردن سایر فیلدهای فرم شما روی دکمه ثبت یا ارسال کلیک کرده و یک درخواست POST به سمت سرور شما می فرستد. یکی از فیلدهایی که همراه فرم ثبت میشود فیلدی با نام arcaptcha-token است.
در این مرحله شما باید مقدار arcaptcha-token را بخوانید و درخواست verify را به سمت سرور آرکپچا ارسال کنید. برای انجام اینکار می توانید از کلاسی که در مرحله قبل ساختیم استفاده کنید. به این منظور میتوانید تابع verify را با ورودی arcaptcha-token فراخوانی کنید.
if ($_SERVER['REQUEST_METHOD'] === 'POST') { // check form submission
if ($ArCaptcha->verify($_POST["arcaptcha-token"])) { // verify that captcha is solved
echo "OK!";
} else {
echo "FAILED!";
}
}
در صورتی که تابع verify مقدار true را برگرداند به این معناست که کاربر چالش را کامل و درست حل کرده است. در غیر این صورت حل چالش با مشکل مواجه شده و شما باید به تبع آن کاربر را ازین امر مطلع سازید.
همچنین میتوانید برای درک بهتر نحوه استفاده از کپچا در php با composer به این صفحه مراجعه کنید و نمونه کد را ببینید.
کپچا یک ابزار ضروری برای جلوگیری از حملات باتهای مخرب است. تمام وبسایتها از جمله وبسایتهای برنامهنویسیشده با زبان PHP و فریمورک لاراول در صفحات و فرمهای خود به سرویس کپچا احتیاج دارند. فرم ثبت نام، فرم ورود، فرم نظرات و فرم تماس با ما، از جمله فرمهای پر استفاده در وبسایت هاست. این فرم ها میتوانند توسط باتهای اینترنتی پر شوند و آسیب ایجاد کنند. از طرفی تشخیص درخواست واقعی کاربر و بات ممکن نیست زیرا باتهای حرفهای به خوبی رفتار کاربر را تقلید میکنند.