حفاظت در مقابل حملات CSRF

در حال تکمیل منقضی شده رایگان
این داکیومنت از طرف توسعه‌دهنده ساپورت نمی‌شود، جدیدترین ورژن داکیومنت بزودی ترجمه خواهد شد.

مقدمه

لاراول حفاظت از اپلیکیشن در مقابل حملات CSRF را بسیار ساده ساخته است. CSRF نوعی سواستفاده مخرب است که به وسیله آن دستورات غیرمجاز از سوی یک کاربر احراز هویت شده اجرا می‌شود.

لاراول برای تمامی سشن‌های مربوط به کاربران فعال، به صورت خودکار یک "توکن" CSRF تولید می‌کند. این توکن برای تایید اینکه کاربر احراز هویت شده همان کسی است که به اپلیکیشن ریکوئست جاری را ارسال کرده است.

هر زمان که یک فرم HTML در اپلیکیشن خود تعریف می‌کنید، باید یک فیلد مخفی (hidden) برای توکن CSRF به فرم اینکلود کنید، در نتیجه میدلور VerifyCsrfToken می‌تواند ریکوئست را تایید کند. با استفاده از دایرکتیو @csrf در blade می‌توانید این فیلد را ایجاد کنید.

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

میدلور VerifyCsrfToken که در گروه میدلور گنجانده شده است، به صورت خودکار تایید می‌کند که آیا توکن موجود در input ریکوئست با توکن ذخیره شده در سشن مطابقت دارد یا خیر.

توکن‌های CSRF و جاوااسکریپت

هنگامی که اپلیکیشن‌های مبتنی بر جاوااسکریپت درست می‌کنید، بهتر است که لایبرری HTTP جاوااسکریپت، توکن CSRF را به صورت خودکار به تمامی ریکوئست‌های خروجی اَتَچ کند. به صورت پیش‌فرض، فایل resources/assets/js/bootstrap.js مقدار متاتگ csrf-token را به وسیله لایبرری Axios HTTP رجیستر می‌کند. اگر از این لایبرری استفاده نمی‌کنید، باید به صورت دستی این رفتار را برای اپلیکیشن خود تنظیم کنید.

مستثنی کردن URIها از CSRF پروتکشن

گاهی می‌خواهید که مجموعه‌ای از URIها را از سی‌سرف پروتکشن مستثنی کنید. برای مثال، اگر از Stripe برای پردازش پرداخت‌ها استفاده می‌کنید و از سیستم وب‌هوک آن استفاده می‌کنید، باید روت هندلر وب‌هوک Stripe خود را از سی‌سرف پروتکشن مستثنی کنید، زیرا Stripe نمی‌داند که باید چه توکن سی‌سرفی را به روت‌های شما ارسال کند.

معمولا، باید این نوع روت‌ها را خارج از گروه میدلور 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

میدلور VerifyCsrfToken، علاوه بر بررسی توکن CSRF از طریق پارامتر POST، هدر X-CSRF-TOKEN ریکوئست را نیز بررسی خواهد کرد. شما باید، برای مثال، توکن را در یک تگ meta قرار دهید:

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

سپس، هنگامی که تگ meta را ساختید، می‌توانید به یک لایبرری مانند جی‌کوئری بگویید تا به صورت اتوماتیک توکن را به هدر تمامی ریکوئست‌ها اضافه کند. انجام این کار، به سادگی سی‌سرف پروتکشن را برای اپلیکیشن‌های مبتنی بر اجکس فراهم می‌کند.

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

به صورت پیش‌فرض، فایل resources/assets/js/bootstrap.js مقدار متاتگ csrf-token را به وسیله لایبرری Axios HTTP رجیستر می‌کند. اگر از این لایبرری استفاده نمی‌کنید، باید به صورت دستی این رفتار را برای اپلیکیشن خود تنظیم کنید.

X-XSRF-TOKEN

لاراول توکن CSRF جاری را در کوکی XSRF-TOKEN ذخیره می‌کند که به هر ریسپانس تولید شده توسط فریمورک اینکلود شده است. از مقدار این کوکی برای سِت کردن هدر X-XSRF-TOKEN ریکوئست می‌توانید استفاده کنید.

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


سایر پست‌های داکیومنت

  • پیش‌گفتار
    • Release Notes ترجمه در ورژن‌های بعدی
    • راهنمای آپگرید ترجمه در ورژن‌های بعدی
    • Contribution Guide ترجمه در ورژن‌های بعدی
  • شروع
    • نصب
    • پیکربندی
    • ساختار دایرکتوری ترجمه در ورژن‌های بعدی
    • Laravel Homestead ترجمه در ورژن‌های بعدی
    • Laravel Valet ترجمه در ورژن‌های بعدی
    • دپلویمنت ترجمه در ورژن‌های بعدی
  • مفاهیم معماری
  • اصول اولیه
  • فرانت‌اند
  • امنیت
    • Authentication ترجمه در ورژن‌های بعدی
    • API Authentication (Passport) ترجمه در ورژن‌های بعدی
    • Authorization ترجمه در ورژن‌های بعدی
    • Encryption ترجمه در ورژن‌های بعدی
    • Hashing ترجمه در ورژن‌های بعدی
    • Resetting Passwords ترجمه در ورژن‌های بعدی
  • مباحث عمیق‌تر
    • Artisan Console ترجمه در ورژن‌های بعدی
    • Broadcasting ترجمه در ورژن‌های بعدی
    • Cache ترجمه در ورژن‌های بعدی
    • Collections ترجمه در ورژن‌های بعدی
    • Events ترجمه در ورژن‌های بعدی
    • File Storage ترجمه در ورژن‌های بعدی
    • Helpers ترجمه در ورژن‌های بعدی
    • Mail ترجمه در ورژن‌های بعدی
    • Notifications ترجمه در ورژن‌های بعدی
    • Package Development ترجمه در ورژن‌های بعدی
    • Queues ترجمه در ورژن‌های بعدی
    • Task Scheduling ترجمه در ورژن‌های بعدی
  • دیتابیس
  • Eloquent ORM
    • Eloquent: Getting Started ترجمه در ورژن‌های بعدی
    • Eloquent: Relationships ترجمه در ورژن‌های بعدی
    • Eloquent: Collections ترجمه در ورژن‌های بعدی
    • Eloquent: Mutators ترجمه در ورژن‌های بعدی
    • Eloquent: API Resources ترجمه در ورژن‌های بعدی
    • Eloquent: Serialization ترجمه در ورژن‌های بعدی
  • Testing
    • Testing: Getting Started ترجمه در ورژن‌های بعدی
    • HTTP Tests ترجمه در ورژن‌های بعدی
    • Browser Tests (Laravel Dusk) ترجمه در ورژن‌های بعدی
    • Database Testing ترجمه در ورژن‌های بعدی
    • Mocking ترجمه در ورژن‌های بعدی
  • Official Packages
    • Laravel Cashier ترجمه در ورژن‌های بعدی
    • Envoy Task Runner ترجمه در ورژن‌های بعدی
    • Laravel Horizon ترجمه در ورژن‌های بعدی
    • API Authentication (Passport) ترجمه در ورژن‌های بعدی
    • Laravel Scout ترجمه در ورژن‌های بعدی
    • Laravel Socialite ترجمه در ورژن‌های بعدی