آموزش لاراول 7: آموزش CSRF Protection در لاراول

مقدمه

در این آموزش laravel به مفاهیم حفاظت از سایت در برابر حملات CSRF می پردازیم. لاراول محافظت از برنامه شما در برابر حملات (cross-site request forgery (CSRF آسان می کند. CSRF نوعی حمله است که به موجب آن دستورات غیر مجاز از طرف کاربر مجاز شمرده می شود.

لاراول برای هر session کاربر فعال که توسط برنامه مدیریت می شود ، به طور خودکار CSRF "token" ایجاد می کند. این token برای تأیید اینکه کاربر تأییدشده شخصی است که در واقع درخواست ها را از برنامه درخواست می کند ، استفاده می شود.

هر زمان که شما یک فرم HTML را در برنامه خود تعریف می کنید ، باید یک فیلد CSRF token مخفی را در فرم قرار دهید تا CSRF protection middleware بتواند درخواست را تأیید کند. برای تولید قسمت token می توانید از دستور @csrf Blade استفاده کنید:

‌<‌form method="POST" action="/profile"‌>‌
        @csrf
        ...
    ‌<‌/form‌>‌

The VerifyCsrfToken middleware ، که در گروه web middleware گنجانده شده است ، به طور خودکار تأیید می کند که token موجود در ورودی درخواست با token ذخیره شده در session مطابقت دارد.

CSRF Tokens و JavaScript

هنگام ساخت برنامه های مبتنی بر جاوا اسکریپت ، بهتر است که JavaScript HTTP library شما به طور خودکار CSRF token را به هر درخواست خروجی متصل کند. به طور پیش فرض ، Axios HTTP library موجود در فایل resources/js/bootstrap.js به طور خودکار با استفاده از مقدار XSRF-TOKEN cookie ، یک هدر X-XSRF-TOKEN ارسال می کند. اگر از این کتابخانه استفاده نمی کنید ، باید به صورت دستی این رفتار را برای برنامه خود پیکربندی کنید.

Excluding URIs از CSRF Protection

بعضی اوقات ممکن است بخواهید مجموعه ای از URI ها را از CSRF protection حذف کنید. به عنوان مثال ، اگر از Stripe برای پردازش استفاده می کنید و از سیستم webhook آنها ، باید Stripe webhook handler route خود را از CSRF protection حذف کنید زیرا Stripe نمی داند CSRF token را برای route های شما ارسال کند.

به طور معمول ، شما باید این نوع route ها را خارج از web middleware group قرار دهید که RouteServiceProvider برای همه route های موجود در فایل routes/web.php اعمال شود.. با این وجود ، می توانید با افزودن URI های آنها به $except از VerifyCsrfToken middleware، مسیرها را نیز exclude کنید:

‌<‌?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/*',
        ];
    }

X-CSRF-TOKEN

علاوه بر بررسی CSRF token به عنوان یک پارامتر POST ، میان افزار VerifyCsrfToken همچنین از نظر هدر درخواست X-CSRF-TOKEN نیز بررسی خواهد شد. به عنوان مثال می توانید توکن را در یک HTML meta tag ذخیره کنید:

‌<‌meta name="csrf-token" content="{{ csrf_token() }}"‌>‌

 هنگامی که meta tag را ایجاد کردید ، می توانید به کتابخانه ای مانند jQuery دستور دهید که به طور خودکار token را به همه هدرهای درخواست اضافه کند. این CSRF protection را برای برنامه های مبتنی بر AJAX شما فراهم می کند:

$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

X-XSRF-TOKEN

لاراول CSRF token فعلی را در کوکی رمزگذاری شده XSRF-TOKEN ذخیره می کند که با هر response تولید شده توسط framework همراه است. برای تنظیم هدر درخواست X-XSRF-TOKENمی توانید از مقدار cookie استفاده کنید.

این کوکی به راحتی ارسال می شود زیرا برخی از فریم ورک ها و کتابخانه های جاوا اسکریپت ، مانند Axios و Angular، به طور خودکار مقدار خود را در هدر X-XSRF-TOKEN برای درخواست های یکسان قرار می دهند.

امیدواریم این آموزش از سری مقالات آموزش لاراول برای شما مفید واقع شده باشد.

× در حال پاسخ به: