فرض کنید یک سیستم خبرنامه دارید و کاربری درخواست لغو اشتراک خبرنامه را دارد، URL مربوطه میتواند به شکل زیر باشد:
example.com/unsubscribe/4
وقتی کاربری این URL را باز میکند اشتراک خبرنامه کاربری با آیدی 4 لغو خواهد شد، حالا فرض کنید کاربری از روی عمد آیدی 4 را به 60 تغییر بدهد، در این صورت اشتراک خبرنامه کاربری با آیدی 60 هم بدون اطلاع خودش لغو خواهد شد. این سناریو میتواند به مرور باعث لغو اشتراک خبرنامه کلیه کاربران شود؛ یکی از ویژگیهایی که لاراول برای جلوگیری از این خرابکاری دارد، آدرسهای امضاء شده است؛ با استفاده از URL های امضا شده، میتوان تا حدودی از درخواستهای ایجاد شده با URL های اصلاح شده و همچنین از خرابکاریهای احتمالی جلوگیری کرد.
🔺ساختن یک Signed URL
در مثال بالا فرض کردیم URL لغو اشتراک خبرنامه به شکل زیر است:
example.com/unsubscribe/4
در نتیجه روت آن به این شکل خواهد بود:
Route::get('unsubscribe/{user_id}', '...')->name('unsubscribe');برای امضاء و امن کردن این URL باید از متد signedRoute که در کلاس URL قرار دارد استفاده کنیم:
$url = URL::signedRoute('unsubscribe', ['user_id' => 1]);نتیجه کد بالا به شکل زیر خواهد داشت:
example.com/unsubcribe/1/?signature=f834ed8570e05de6c50ad10bd6abcf71e9867fcb14bdf2670b4bf572ce346f3b
و اگر کاربری این URL را تغییر داد به هیچوجه معتبر نخواهد بود و میتوان اینگونه از خراب کاریهای احتمالی جلوگیری کرد؛ همچنین لازم به ذکر است که با متد temporarySignedRoute میتوان یک تاریخ انقضاء برای URL مان مشخص کنیم و تعیین کنیم URL مربوطه تا چه زمانی میتواند معتبر باشد:
$url = URL::temporarySignedRoute(
'unsubscribe',
now()->addMinutes(60), ['user' => 1]
);🔺 اعتبار سنجی آدرسهای امضاء شده
برای اعتبار سنجی آدرسهای مربوطه میتوانید از متد hasValidSignature که در کلاس Request قرار دارد استفاده کنید و بررسی کنید که URL مربوطه معتبر است یا خیر:
Route::get('unsubscribe/{user_id}/', function (Request $request) {
if (! $request->hasValidSignature()) {
abort(401);
}
// ...
});همچنین میتوانید از میدلور ValidateSignature استفاده کنید تا عملیات اعتبارسنجی خودکار انجام برای استفاده کردن از این میدلور فقط کافی است که به فایل Kernel.php بروید و کد زیر را اضافه کنید:
protected $routeMiddleware = [
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
....
];و در نتیجه این میدلور را به روتتان اضافه کنید:
Route::get('unsubscribe/{user_id}', '...')->name('unsubscribe')->middleware('signed');از حالا به بعد این روت زمانی به درستی کار خواهد کرد که مقدار پارامتر signature معتبر باشید در غیر این صورت خطای 403 به کاربر نمایش داده میشود.
📍همچنین یک نمونه بسیار ساده از آدرسهای امضاء شده در این مخزن ایجاد کردهام که طبق نیاز میتوانید آن را تغییر داده و استفاده کنید
🔗 اطلاعات بیشتر و داکیومنت مربوطه
👤 Maryam
💎 Channel: @DevelopixLaravel