غیر فعال کردن CSRF بر روی روت‌های خاص در لاراول

گردآوری و تالیف : رضا جمال زاده
تاریخ انتشار : 13 مهر 1398
دسته بندی ها : لاراول

همانطور که می‌دانید، فریمورک لاراول 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 قرار نگیرند را در درون این آرایه قرار دهید. به همین سادگی

منبع

مقالات پیشنهادی

  • تکرار کردن یک سطر در لاراول

    امروز میخواهم در مورد ویژگی در لاراول صحبت کنم که به اصطلاح "hidden" است ، یعنی این قابلیت در سیستم لاراول وجود دارد اما در documentation لاراول چیزی...

    حسام موسوی
  • مدیریت رویدادها در لاراول

    رویداد (Event) یک عمل یا اتفاقی هست که توسط برنامه سازماندهی شده که ممکنه توسط برنامه هم مدیریت بشه. رویدادهای لاراول بسادگی پیاده سازی می شوند. رویدا...

    امیررضا سیستانه ای
  • دیباگ‌کردن در لاراول

    شاید خیلی از واقعیت دور نباشد اگر بگوییم که زمان دیباگ‌کردن در لاراول به انداز‌ی زمان برنامه‌ریزی و کد‌نویسی برای یک برنامه در لاراول باشد‌،‌ بنابراین...

    رضا جمال زاده
  • عملیات آرشیو کردن فایل ها در لاراول

    در این مقاله میخواهیم نحوه ی کار کردن با فایل های Zip در فریمورک لاراول رو آموزش بدیم. برای اینکار از یک پکیج به نام zipper استفاده می کنیم. این یک پک...

    امیررضا سیستانه ای