یکی از مهمترین بخشهای آموزش لاراول که در زمان کار با دیتابیس یا Modelها با آن سر و کار داریم، Mass Assignment است، که رعایت نکردن آن باعث به خطر افتادن جدی امنیت سایت میشود. اما این عبارت به چه معنا است؟ چرا رعایت نکردن laravel mass assignment میتواند، امنیت وب سایت شما را در معرض خطر قرار دهد، و چگونه میتوان از این خطرات جلوگیری کرد؟ جواب این سوالها را در ادامه خواهید یافت.
همانطور که در ابتدا گفتیم Mass Assignment یکی از مهمترین بخشهای آموزش لاراول است، که رعایت نکردن آن باعث به خطر افتادن امنیت سایت میشود.
بهطور مثال فرض کنید، یک form با بخشهای نام و نام خانوادگی، شمارهی همراه، آدرس و رمز عبور داریم، که کاربر باید آن را تکمیل کنید. حال برای همین form در Database علاوه بر بخشهای بالا چند بخش دیگر مانند نقش کاربری که شامل Admin یا User، دسترسیها و بخشهای امنیتی مهم دیگری میشود داریم. در این صورت هر کاربری که دانش برنامهنویسی داشته باشد، میتواند هنگام تکمیل form با اعمال چند تغییر کوچک نقش کاربری خود را Admin وارد کند، و به راحتی به تمام اطلاعات سایت دسترسی پیدا کند.
برای جلوگیری از این Bugهای امنیتی، باید در همان ابتدا تعیین کنیم که چه field هایی میتواند مقدار بگیرد. برای این کار میتوانیم، از دو حالت guarded یا fillable استفاده کنیم.
هنگامی که یک Attribute را در fillable وارد کنیم، به طور خودکار تمام Attributeهای دیگر guarded میشوند. همچنین اگر یک Attribute را در guarded وارد کنیم، بهطور خودکار تمام Attributeهای دیگر fillable میشوند.
فرض کنید در مثالی، تنها میخواهیم ۲ Attribute غیرقابل پر کردن باشند، در این حالت بهتر است، بهجای وارد کردن Attribute هایی که قابل پر کردن میباشند، در fillable، آن Attribute هایی که غیرقابل پر کردن هستند، را در guarded وارد کنیم.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name'];
}
در دستور بالا Attribute که میتواند مقدار بگیرد، را در fillable وارد کردیم، پس تمام Attributesها به جز name که fillable است، guarded میباشند.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = ['price'];
}
در دستور بالا Attribute که نمیتواند مقدار بگیرد، را در guarded وارد کردیم، پس تمام Attributesها به جز price که guarded است، fillable میباشند.
برای ایجاد مستقیم یک داده در Database همراه با قابلیت Mass Assignment، میتوانیم از firstOrCreate و firstOrNew استفاده کنیم.
// Retrieve flight by name, or create it if it doesn't exist...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// Retrieve flight by name, or create it with the name, delayed, and arrival_time attributes...
$flight = App\Flight::firstOrCreate(
['name' => 'Flight 10'],
['delayed' => 1, 'arrival_time' => '11:30']
);
// Retrieve by name, or instantiate...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
// Retrieve by name, or instantiate with the name, delayed, and arrival_time attributes...
$flight = App\Flight::firstOrNew(
['name' => 'Flight 10'],
['delayed' => 1, 'arrival_time' => '11:30']
);
// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99, 'discounted' => 1]
);
جمعبندی:
در این مقاله به آموزش laravel mass assignment پرداختیم، اگر میخواهید همهی مسائل امنیتی را رعایت کنید، باید بگوییم که در هر صورت استفاده از روش
بیشتر به نفع شما است. چرا که هنگام استفاده از guarded ممکن است، فیلدهای اضافهی دیگری به غیر از فیلدهای جدول مورد نظرمان به همراه Request کاربران ارسال شوند. در این صورت اگر از guarded استفاده کرده باشیم، کاربر به خطای دیتابیس برخورد خواهد کرد، چرا که لاراول تلاش میکند، اطلاعات را درون ستون هایی بریزد، که وجود خارجی ندارند، اما در صورت استفاده از برنامه با Exception مواجه میشود، که کاملا امن است.اگر به یادگیری بیشتر لاراول علاقه دارید میتوانید در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.