معرفی و جلوگیری از حملات csrf در لاراول
یکی از محبوبترین فریمورکها در زمینه توسعه وب، لاراول است. با اینکه لاراول به سادگی قابل استفاده است، اما دارای جزئیات و نکات بسیاری است که برای یادگیری آنها نیازمند دقت و زمان مناسبی میباشد. یکی از این نکات مهم در حوزه امنیت، حفاظت CSRF در لاراول است. حفاظت CSRF از وب اپلیکیشنها در برابر حملات Cross-Site Request Forgery را تضمین میکند. شناخت این نوع حملات و روشهای مقابله با آنها برای هر برنامهنویس لاراول بسیار حائز اهمیت است.
اگر شما یک برنامهنویس لاراول هستید یا یک وب سایت دارید و نمیخواهید وب سایتتان تحت حملات CSRF در لاراول قرار بگیرد، تا انتهای این مقاله با بایت گیت همراه باشید.
حمله CSRF چیست؟
حمله CSRF (Cross-Site Request Forgery) یک نوع حمله امنیتی است که در برابر وب اپلیکیشنها صورت میگیرد. در این نوع حمله، مهاجم تلاش میکند تا به طور غیرمجاز دستوراتی را از طریق یک کاربر معمولی در وب سایتی که او وارد شده است، اجرا کند.
فرض کنید کاربری به یک وب سایت وارد شده و در همان زمان، توسط مهاجمی که در وب سایت دیگری عضو است، یک صفحه مخرب را باز میکند. اگر صفحه مخرب بتواند درخواستهایی را به وب سایت اصلی کاربر ارسال کند و از مجوزهای کاربر استفاده کند، عملیاتی مشابه درخواستهای معتبر کاربر را اجرا میکند، بدون اینکه کاربر آن را بداند.
به عبارت سادهتر، در حمله CSRF، مهاجم از طریق مغلوب کردن مکانیزمهای اعتبارسنجی وب سایت، میتواند درخواستهایی را به نام کاربر ارسال کند و عملیات ناخواستهای را انجام دهد. این حمله میتواند منجر به اعمال غیرمجاز، تغییرات در حساب کاربری، خرابی وب سایت و سرقت اطلاعات شود.
برای محافظت در برابر حمله CSRF، فریمورکهای مانند لاراول از مکانیزمهایی مانند توکن CSRF (CSRF Token) استفاده میکنند که درخواستهای معتبر را از درخواستهای مخرب تشخیص میدهد و اجازه ارسال آنها را میدهد.
توضیح یک نمونه واقعی از حمله CSRF
برای درک بیشتر بهتر است با یک مثال مقاله را ادامه دهیم.
یک نمونه کاربردی از حمله CSRF میتواند مربوط به یک وب سایت خرید آنلاین باشد. در این حالت، فرض کنید یک کاربر (مورد هدف) به عنوان وارد شده در وب سایت خرید آنلاین خود باشد و در حساب کاربری خود اعتبار مالی دارد.
حالا، مهاجم یک ایمیل تقلبی به کاربر مورد هدف میفرستد. این ایمیل شامل یک لینک است که به ظاهر مربوط به تخفیفی ویژه برای خرید اینترنتی است. کاربر مورد هدف، ایمیل را باز میکند و بدون اطلاع از تقلب، روی لینک کلیک میکند.
با کلیک روی لینک، کاربر مورد هدف به صفحه مخربی هدایت میشود که شبیه به صفحه واقعی وب سایت خرید آنلاین است. در این صفحه، یک فرم پرداخت وجود دارد که حاوی اطلاعاتی مانند شماره کارت اعتباری، تاریخ انقضا و CVV است.
اگر کاربر مورد هدف این فرم را تکمیل کند و روی دکمه پرداخت کلیک کند، درخواست انتقال مبلغی از حساب کاربری وی به حساب مهاجم ارسال میشود، بدون اینکه کاربر آن را بفهمد.
در این مثال، مهاجم با استفاده از حمله CSRF و ارسال یک صفحه تقلبی، توانسته است کاربر را به انجام عملیات پرداخت تقلبی و انتقال پول به حساب خود ترغیب کند. این نمونه نشان میدهد که حمله CSRF چگونه میتواند در صورت عدم وجود مکانیزمهای محافظت، به سرقت مالی و آسیب به کاربران منجر شود.
برای جلوگیری از حملات CSRF، توصیه میشود توکن CSRF به درخواستهای مهم و اعمالی که تغییرهای حساب کاربری را در پسزمینه انجام میدهند، اضافه شود. این توکن به عنوان یک عامل اعتبار دستورات، درخواستهای معتبر را از درخواستهای مخرب تشخیص میدهد و اجازه ارسال آنها را میدهد.
برای انجام موفقیت آمیز حمله CSRF چه مواردی لازم است؟
برای انجام موفقیتآمیز یک حمله CSRF، مهاجم باید به موارد زیر دست یابد:
- آگاهی از آدرس وب سایت هدف: مهاجم باید آدرس وب سایت قربانی را بشناسد و با دقت آن را مورد بررسی قرار دهد.
- طراحی صفحه تقلبی: مهاجم باید یک صفحه وب تقلبی ایجاد کند که شامل کدهای مخرب است. این صفحه باید طراحی شده و به گونهای برنامهنویسی شود که کاربر را به اجرای درخواستهای مخرب تشویق کند.
- جذب کاربران: مهاجم باید کاربران را به صفحه تقلبی هدایت کند. این میتواند از طریق ایمیلهای تقلبی، لینکهای مخفی در صفحات دیگر، پیامهای اجتماعی و غیره صورت گیرد.
- عملیات مخرب: صفحه تقلبی باید حاوی درخواستهای مخرب باشد که به طور خودکار برای وب سایت قربانی ارسال میشوند. این درخواستها باید به طور کامل و دقیق اطلاعات مورد نیاز را برای انجام عملیات مخرب (مانند تغییر حساب کاربری یا انتقال وجه) شامل کنند.
- عدم وجود مکانیزمهای محافظت: برای موفقیت حمله CSRF، وب سایت قربانی باید آسیبپذیری در مکانیزمهای اعتبارسنجی خود داشته باشد. به عبارتی دیگر، باید بتواند درخواستهای مخرب را بدون تأیید کاربر اجرا کند.
اگر هر یک از این موارد فراهم نباشد، حمله CSRF ممکن است ناموفق باشد. برای مقابله با این نوع حمله، وب سایتها باید از مکانیزمهای امنیتی مانند توکن CSRF استفاده کنند و مطمئن شوند که درخواستهای ارسالی حاوی اعتبار معتبر هستند و توسط کاربر مورد تأیید قرار گرفتهاند
CSRF Protection چیست و چگونه از آن استفاده کنیم؟
در لاراول، یک راهکار آسان به نام CSRF Protection برای محافظت در برابر حملات CSRF در اختیار قرار داده شده است. CSRF Protection در لاراول به این صورت عمل میکند که برای هر کاربر فعال در برنامه، یک توکن CSRF تولید میشود. این توکن برای تأیید اینکه آیا درخواستی که ارسال میشود از سوی یک فرد واقعی است یا خیر، استفاده میشود.
هرگاه شما یک فرم HTML را با استفاده از تگ <form> ایجاد میکنید، حتماً باید توکن CSRF را درون آن قرار دهید تا CSRF Protection در لاراول بتواند درخواست را تأیید کند. در صورتی که این کار را انجام ندهید، درخواست شما رد یا رد شده خواهد شد. برای انجام این عمل، کافی است عبارت @csrf
را درون تگ فرم خود قرار دهید. به عنوان مثال:
<form method="POST" action="/profile">
@csrf
...
</form>
یکی از میدلورهای موجود در گروه میدلورهای وب در لاراول، VerifyCsrfToken نام دارد. این میدلور به طور خودکار بررسی میکند که آیا توکن موجود در درخواست با توکنی که در جلسه (session) ذخیره شده است، مطابقت دارد یا خیر.
جلوگیری از حملات CSRF در لاراول با استفاده از توکنها
در لاراول، جلوگیری از حملات CSRF با استفاده از توکنها بسیار آسان است. لاراول از روش Double-Submit Cookie برای محافظت در برابر حملات CSRF استفاده میکند. این روش به این صورت عمل میکند که هرگاه یک کاربر وارد سیستم شود، یک توکن CSRF به صورت یکتا به وی اختصاص داده میشود. این توکن به صورت یک کوکی (cookie) در مرورگر ذخیره میشود و به صورت همزمان در فرمها نیز به عنوان یک فیلد مخفی (hidden field) قرار میگیرد.
هنگام ارسال هر درخواست POST، لاراول بررسی میکند که آیا توکن CSRF موجود در کوکی با مقداری که در فیلد مخفی فرم ارسال شده است، مطابقت دارد یا خیر. اگر مطابقت وجود داشته باشد، درخواست به عنوان معتبر شناخته شده و پردازش میشود. در غیر این صورت، لاراول این درخواست را به عنوان یک حمله CSRF تشخیص میدهد و آن را رد میکند.
برای استفاده از این روش در لاراول، کافی است که فرمهای خود را با استفاده از تگ @csrf
توکن CSRF محافظت کنید. برای مثال:
[html]</pre>
<form action="accountdelete.php" method="post"><input type="hidden" name="CSRFToken" value="OWY4NmQdwODE4hODRjN2DQ2NTJlhMmZlYWEwYzU1KYWQwMTVhM2JmLNGYxYjJiMGI4jTZDE1ZDZjMTViMGYwMGEwOA==" />
…</form>
<pre>
[/html]
با این تغییرات، لاراول به طور خودکار توکن CSRF را در فرمهای شما قرار داده و بررسی میکند تا حملات CSRF را جلوگیری کند. توجه داشته باشید که برای استفاده از این روش، باید حالت web
را در فایل app/Http/Kernel.php
بررسی کنید و مطمئن شوید که میدلور VerifyCsrfToken
به درستی فعال شده است.
نکته مهم دیگری که باید در نظر داشته باشید این است که در لاراول، درخواستهای GET نیازی به توکن CSRF ندارند. توکن CSRF فقط برای درخواستهای POST، PUT، PATCH، DELETE و سایر درخواستهایی که تغییراتی در سرور ایجاد میکنند، مورد استفاده قرار میگیرد.
آموزش غیر فعال کردن CSRF بر روی مسیرهای خاص در لاراول
در لاراول، شما میتوانید CSRF را بر روی مسیرهای خاص غیرفعال کنید. برای انجام این کار، میتوانید از میانافزار (Middleware) VerifyCsrfToken
استفاده کنید و آن را برای مسیرهای مورد نظر غیرفعال کنید.
- ایجاد یک کلاس Middleware سفارشی:
ابتدا، شما نیاز دارید یک کلاس میانافزار سفارشی ایجاد کنید. برای این کار، میتوانید از دستور زیر در ترمینال استفاده کنید:
php artisan make:middleware DisableCsrf
این دستور یک فایل با نام DisableCsrf.php
در مسیر app/Http/Middleware
ایجاد میکند.
- ویرایش کلاس Middleware سفارشی:
سپس، میتوانید فایلDisableCsrf.php
را ویرایش کنید و دستورات مربوط به غیرفعال کردن CSRF را در آن قرار دهید. برای غیرفعال کردن CSRF، شما میتوانید متدhandle
را به صورت زیر ویرایش کنید:
is('your/custom/route')) {
return $next($request);
}
return app(\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class)->handle($request, $next);
}
}
در این مثال، CSRF فعال است برای تمام مسیرها به جز your/custom/route
. در صورتی که درخواست ارسال شده به مسیر your/custom/route
باشد، میانافزار VerifyCsrfToken
صرفاً عبور خواهد کرد و هیچ بررسی CSRF انجام نمیدهد. در صورتی که درخواست به مسیر دیگری باشد، میانافزار VerifyCsrfToken
به صورت عادی اجرا خواهد شد.
- ثبت کلاس Middleware سفارشی:
برای استفاده از کلاس Middleware سفارشی خود، باید آن را در فایلapp/Http/Kernel.php
ثبت کنید. در فایلKernel.php
، میتوانید متدprotected $routeMiddleware
را ویرایش کنید و کلید و مقدار زیر را به آن اضافه کنید:
protected $routeMiddleware = [
'disablecsrf' => \App\Http\Middleware\DisableCsrf::class,
];
- استفاده از میانافزار سفارشی در مسیرهای مورد نظر:
حالا میتوانید میانافزار سفارشی خود را در مسیرهای مورد نظر استفاده کنید. برای این کار، میتوانید از روش Middleware در توابعweb.php
یاapi.php
استفاده کنید. برای مثال:
Route::middleware('disablecsrf')->post('your/custom/route', 'YourController@yourMethod');
در این مثال، مسیر your/custom/route
با استفاده از میانافزار سفارشی disablecsrf
تعریف شده است و CSRF بر روی این مسیر غیرفعال میشود.
با این تغییرات، CSRF بر روی مسیرهای خاص در لاراول غیرفعال میشود، در حالی که بر روی سایر مسیرها قابل استفاده خواهد بود. توجه داشته باشید که بررسی امنیتی CSRF بر روی مسیرهای غیرفعال شده بر عهده شما خواهد بود و باید از روشهای دیگری برای محافظت از این مسیرها در برابر حملات CSRF استفاده کنید.
استفاده از کتابخانه anticsurf برای محافظت در برابر حملات CSRF
محافظت در برابر حملات CSRF یکی از نکات مهم امنیتی است که در برنامههای وب باید مد نظر قرار گیرد. یکی از راهکارهای موجود برای اعمال محافظت CSRF در پروژههای لاراول استفاده از کتابخانه AnticSRF است. این کتابخانه به شما امکان میدهد تا به سادگی محافظت CSRF را در برنامه خود پیادهسازی کنید. در زیر توضیحاتی در مورد استفاده از کتابخانه AnticSRF در لاراول آورده شده است:
- نصب کتابخانه AnticSRF:
ابتدا، برای استفاده از کتابخانه AnticSRF، آن را در پروژه لاراول خود نصب کنید. میتوانید این کار را با استفاده از Composer انجام دهید:
composer require chrisbjr/anticaptcha
- پیکربندی AnticSRF:
بعد از نصب کتابخانه، شما باید آن را در پروژه لاراول خود پیکربندی کنید. برای این کار، فایلconfig/app.php
را باز کنید و مقادیر زیر را به آرایهproviders
اضافه کنید:
'providers' => [
Chrisbjr\Anticaptcha\AnticaptchaServiceProvider::class,
],
همچنین، مقدار زیر را به آرایه aliases
اضافه کنید:
'aliases' => [
'Anticaptcha' => Chrisbjr\Anticaptcha\Facades\Anticaptcha::class,
],
- استفاده از AnticSRF در روتها:
حالا شما میتوانید از AnticSRF برای محافظت CSRF در روتهای لاراول استفاده کنید. برای این کار، میتوانید متدroutes/web.php
را باز کنید و دستورات زیر را در آن قرار دهید:
use Chrisbjr\Anticaptcha\Facades\Anticaptcha;
Route::post('your/route', function () {
Anticaptcha::check('your_csrf_token');
});
در این مثال، با فراخوانی متد Anticaptcha::check('your_csrf_token')
، توکن CSRF بررسی میشود. شما باید مقدار توکن CSRF مربوط به درخواست را به عنوان پارامتر ورودی به متد check
ارسال کنید. در صورتی که توکن معتبر نباشد، خطایی خواهد رخ داد و اجرای روت متوقف خواهد شد.
با این تغییرات، شما میتوانید از کتابخانه AnticSRF برای اعمال محافظت CSRF در پروژه لاراول خود استفاده کنید. این کتابخانه با بررسی توکن CSRF، درخواستهای مشکوکمحافظت در برابر حملات CSRF با استفاده از کتابخانه AnticSRF
در این مقاله، ما به بررسی راهکاری برای محافظت در برابر حملات Cross-Site Request Forgery (CSRF) با استفاده از کتابخانه AnticSRF میپردازیم. حملات CSRF یکی از تهدیدات امنیتی جدی برای وب سایتها است و میتوانند در صورت عدم محافظت صحیح، به وسیلهٔ آنها اقدامات ناخواستهای از سوی کاربران انجام شود.
AnticSRF یک کتابخانه قدرتمند است که توسط Chrisbjr توسعه داده شده است و به شما امکان میدهد به راحتی محافظت CSRF را در پروژههای لاراول خود پیادهسازی کنید. با استفاده از این کتابخانه، شما میتوانید توکنهای CSRF را بسیار ساده و امن ایجاد کرده و درخواستهای خود را مورد بررسی قرار دهید.
برای استفاده از کتابخانه AnticSRF در پروژه لاراول خود، مراحل زیر را دنبال کنید:
- نصب کتابخانه: ابتدا، با استفاده از ابزار Composer، کتابخانه AnticSRF را در پروژه لاراول خود نصب کنید. برای این کار، دستور زیر را در محیط خط فرمان اجرا کنید:
composer require chrisbjr/anticaptcha
- پیکربندی AnticSRF: پس از نصب کتابخانه، برای استفاده از آن در پروژه، باید آن را در فایل
config/app.php
پیکربندی کنید. در این فایل، مقادیر زیر را به آرایهproviders
اضافه کنید:
'providers' => [
// ...
Chrisbjr\Anticaptcha\AnticaptchaServiceProvider::class,
],
همچنین، مقدار زیر را به آرایه aliases
اضافه کنید:
'aliases' => [
// ...
'Anticaptcha' => Chrisbjr\Anticaptcha\Facades\Anticaptcha::class,
],
- استفاده از AnticSRF در روتها: حالا میتوانید از کتابخانه AnticSRF برای محافظت CSRF در روتهای لاراول خود استفاده کنید. برای این کار، میتوانید در دستورات مربوط به روتهای POST، تابع
Anticaptcha::check
را فراخوانی کنید و توکن CSRF را بررسی کنید. مثال زیر نحوه استفاده از AnticSRF را نشان میدهد:
use Chrisbjr\Anticaptcha\Facades\Anticaptcha;
Route::post('/your/route', function () {
Anticaptcha::check('your_csrf_token');
});
جمع بندی: چرا باید از قابلیت CSRF Protection در لاراول استفاده کنیم؟
در این مقاله، تلاش شده است تا به طور جامع به توضیح حملات CSRF، روش عملکرد آنها و راهکارهای مقابله با این نوع تهدیدات پرداخته شود. اهمیت رعایت نکات امنیتی در مورد این ضعف امنیتی که یکی از خطرات جدی در وب سایتهاست و در صورت نادیده گرفته شدن میتواند بسیار خطرناک باشد و به شدت به سودآوری وجود دارد. اگر از فریمورک لاراول استفاده میکنید، با استفاده از قابلیت حفاظت CSRF در لاراول به راحتی میتوانید از این نوع حملات جلوگیری کنید.
اگر شما روشهای دیگری برای دفاع در برابر حملات CSRF میشناسید، خوشحال میشویم آنها را در بخش نظرات با سایر کاربران بایت گیت به اشتراک بگذارید.