- پنجشنبه 20 دی 1397 ساعت 15:18
- 5.6.29
- در حال تکمیل
- منقضی شده
مقدمه
لاراول حفاظت از اپلیکیشن در مقابل حملات 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 ترجمه در ورژنهای بعدی
- دپلویمنت ترجمه در ورژنهای بعدی
- مفاهیم معماری
- چرخه کار ریکوئستها
- Service Container ترجمه در ورژنهای بعدی
- سرویس پرووایدرها
- فسادها ترجمه در ورژنهای بعدی
- Contracts ترجمه در ورژنهای بعدی
- اصول اولیه
- مسیریابی
- میدلور
- حفاظت در مقابل حملات CSRF
- کنترلرها
- HTTP Requests ترجمه در ورژنهای بعدی
- HTTP Responses ترجمه در ورژنهای بعدی
- ویوها
- تولید URL
- HTTP Session ترجمه در ورژنهای بعدی
- Validation ترجمه در ورژنهای بعدی
- Error Handling ترجمه در ورژنهای بعدی
- Logging ترجمه در ورژنهای بعدی
- فرانتاند
- تمپلتهای Blade
- محلیسازی
- JavaScript & CSS Scaffolding ترجمه در ورژنهای بعدی
- Compiling Assets (Laravel Mix) ترجمه در ورژنهای بعدی
- امنیت
- 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 ترجمه در ورژنهای بعدی
- دیتابیس
- دیتابیس: شروع ترجمه در ورژنهای بعدی
- Database: Query Builder ترجمه در ورژنهای بعدی
- دیتابیس: صفحهبندی
- دیتابیس: مایگریشن
- دیتابیس: سیدینگ
- Redis ترجمه در ورژنهای بعدی
- 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 ترجمه در ورژنهای بعدی