همانطور که میدانید، فریمورک لاراول CSRF را برای محافظت از اپلیکیشن و افزایش امنیت آن، بر روی همه روتهای اپلیکیشن ارائه داده است. گاهی اوقات ممکن است شما بخواهید برخی از روتها را از بررسی محافظت CSRF خارج کنید، به عبارت دیگر بر روی برخی از روتهای مشخص این مورد را اعمال نکنید. در این مقاله ما به چگونگی غیرفعال کردن بررسی CSRF در برخی از روتهای خاص خواهیم پرداخت.
مفهوم CSRF
ابتدا به توضیح مفهوم CSRF خواهیم پرداخت. شما ممکن است قبلاً در مورد CSRF اطلاعاتی داشته باشید، اما ما اینجا مفهوم CSRF را برای توسعه دهندگان تازهکار بیان میکنیم.
" جعل درخواست بین سایتی (به اختصار CSRF) نوعی از حملات است که مرورگر وب را برای انجام عملیاتی ناخواسته در یک اپلیکیشن لاراول که کاربر در آن لاگین شده است را فریب میدهد" CSRF همچنین به نامهای XSRF ، Sea Surf و Session Ridingشناخته میشود.
در نهایت حملات CSRF میتواند برای کاربر نهایی و صاحب وبسایت ویرانگر باشد. این کار در نهایت میتواند منجر به انتقال سرمایه، تغییر رمز عبور و یا سرقت اطلاعات شخصی یک کاربر به صورت غیر مجاز شود. در حملات CSRF دستورات غیرمجاز در پشت پردهی یک کاربر مجازی انجام میشود.
چگونه لاراول CSRF را مدیریت میکند؟
در لاراول، درmiddleware و در کلاس Illuminate\Foundation\Http\Middleware\VerifyCsrfTokenو همچنین در متد handle() آن ، این متد در هر درخواست HTTP اجرا میشود.
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*
* @throws \Illuminate\Session\TokenMismatchException
*/
public function handle($request, Closure $next)
{
if (
$this->isReading($request) ||
$this->runningUnitTests() ||
$this->inExceptArray($request) ||
$this->tokensMatch($request)
) {
return tap($next($request), function ($response) use ($request) {
if ($this->shouldAddXsrfTokenCookie()) {
$this->addCookieToResponse($request, $response);
}
});
}
throw new TokenMismatchException;
}
در متد handle() از کلاس VerifyCsrfToken، ما میدانیم که اگر
$this->isReading($request)
یا
$this->tokensMatch($request)
مقدار true را بازنگردانند، یک ارورTokenMismatchException پرتاب میشود.
متد isReading($request) به سادگی به دنبال خواندن افعالی مانند HEAD، GETو OPTION است.
/**
* Determine if the HTTP request uses a ‘read’ verb.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function isReading($request)
{
return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']);
}
در صورتی که یکی از موارد بالا در درخواست استفاده شود، آن را از نظر CSRF چک میکند. هدف کلی استفاده از CSRF جلوگیری از ارسال دادههای فرم با استفاده از POST از سایتهای دیگر است. بنابراین ما میتوانیم درخواستهای GET را نادیده بگیریم.
اگر isReading($request)، false برگرداند، متد tokenMatch($request) صدا زده میشود. این کار در واقع برای فهمیدن این موضوع است که آیا توکن در درخواست گنجانده شده است؟ و در صورتی که این چنین باشد بررسی میکند که آیا مطابق با موارد ذخیره شده در session است یا خیر.
در همان کلاس VerifyCsrfToken ما همچنین میتوانیم یک ویژگی آرایهای که $except نامیده میشود را پیدا کنیم.
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [];
همانطور که در بالا میبینید، شما میتوانید URLهای که میخواهید از بررسی CSRF خارج شوند را در درون آرایه $except قرار دهید.
غیرفعال کردن CSRF بر روی روتهای خاص
حالا، اگر ما کلاس App\Http\Middleware\VerifyCsrfToken را باز کنیم، میبینیم که این کلاس به سادگی از کلاس uminate\Foundation\Http\Middleware\VerifyCsrfToken، extend شده است بدین ترتیب دسترسی به ویژگی $except را فراهم میکند.
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 = [
//
];
}
شما به سادگی میتوانید روتهایی که میخواهید مورد بررسی CSRF قرار نگیرند را در درون این آرایه قرار دهید. به همین سادگی
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید