حفاظت CSRF
معرفی
لاراول محافظت از برنامه شما را در برابر حملات جعل درخواست بین سایتی (CSRF) آسان می کند. جعل درخواست های بین سایتی نوعی سوء استفاده مخرب است که به موجب آن دستورات غیرمجاز از طرف یک کاربر احراز هویت شده انجام می شود.
لاراول برای هر جلسه کاربر فعال که توسط برنامه مدیریت می شود، به طور خودکار یک "توکن" CSRF تولید می کند. این نشانه برای تأیید اینکه کاربر احراز هویت شده کسی است که واقعاً درخواست ها را به برنامه ارسال می کند استفاده می شود.
هر زمان که یک فرم HTML را در برنامه خود تعریف می کنید، باید یک فیلد رمز پنهان CSRF را در فرم قرار دهید تا میان افزار حفاظت CSRF بتواند درخواست را تأیید کند. می توانید از
@csrf
دستورالعمل Blade برای تولید فیلد نشانه استفاده کنید:
<form method="POST" action="/profile"> @csrf ...</form>
میانافزار
، که در گروه میانافزار قرار دارد ،
VerifyCsrfToken
بهطور
web
خودکار تأیید میکند که نشانه موجود در ورودی درخواست با توکن ذخیرهشده در جلسه مطابقت دارد.
توکنهای CSRF و جاوا اسکریپت
هنگام ساخت برنامه های کاربردی مبتنی بر جاوا اسکریپت، راحت است که کتابخانه HTTP جاوا اسکریپت خود را به طور خودکار رمز CSRF را به هر درخواست خروجی متصل کنید. بهطور پیشفرض، کتابخانه HTTP Axios ارائهشده در
resources/js/bootstrap.js
فایل بهطور خودکار یک
X-XSRF-TOKEN
هدر را با استفاده از مقدار
XSRF-TOKEN
کوکی رمزگذاریشده ارسال میکند. اگر از این کتابخانه استفاده نمی کنید، باید به صورت دستی این رفتار را برای برنامه خود پیکربندی کنید.
مستثنی کردن URI ها از حفاظت CSRF
گاهی اوقات ممکن است بخواهید مجموعه ای از URI ها را از حفاظت CSRF حذف کنید. به عنوان مثال، اگر از Stripe برای پردازش پرداختها استفاده میکنید و از سیستم webhook آنها استفاده میکنید، باید مسیر کنترلر Stripe webhook خود را از حفاظت CSRF حذف کنید، زیرا Stripe نمیداند چه توکن CSRF را به مسیرهای شما ارسال کند.
به طور معمول، شما باید این نوع مسیرها را خارج از
web
گروه میان افزار قرار دهید که
RouteServiceProvider
برای همه مسیرهای موجود در
routes/web.php
فایل اعمال می شود. با این حال، میتوانید مسیرها را با اضافه کردن URI آنها به
$except
ویژگی میانافزار حذف کنید
VerifyCsrfToken
:
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware{ /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'stripe/*', 'http://example.com/foo/bar', 'http://example.com/foo/*', ];}
میانافزار CSRF بهطور خودکار هنگام اجرای آزمایشها غیرفعال میشود .
X-CSRF-TOKEN
علاوه بر بررسی توکن CSRF به عنوان پارامتر POST،
VerifyCsrfToken
میان افزار هدر درخواست را نیز بررسی می کند
X-CSRF-TOKEN
. به عنوان مثال می توانید توکن را در یک
meta
تگ HTML ذخیره کنید:
<meta name="csrf-token" content="{{ csrf_token() }}">
سپس، هنگامی که تگ را ایجاد کردید
meta
، می توانید به کتابخانه ای مانند jQuery دستور دهید تا توکن را به صورت خودکار به تمام سرصفحه های درخواست اضافه کند. این حفاظت CSRF ساده و راحت را برای برنامه های مبتنی بر AJAX شما فراهم می کند:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }});
X-XSRF-TOKEN
لاراول توکن CSRF فعلی را در یک
XSRF-TOKEN
کوکی رمزگذاری شده ذخیره می کند که با هر پاسخ تولید شده توسط فریم ورک گنجانده شده است. می توانید از مقدار کوکی برای تنظیم
X-XSRF-TOKEN
هدر درخواست استفاده کنید.
این کوکی عمدتاً به عنوان یک راحتی ارسال میشود، زیرا برخی از چارچوبها و کتابخانههای جاوا اسکریپت، مانند Angular و Axios، بهطور خودکار مقدار آن را در هدر
X-XSRF-TOKEN
در درخواستهای با منبع یکسان قرار میدهند.
به طور پیش فرض،
resources/js/bootstrap.js
فایل شامل کتابخانه Axios HTTP است که به طور خودکار این را برای شما ارسال می کند.