انتقل إلى محتوى الدرس
الدرس 36
دورة إطار العمل Laravel

إنشاء وتحديث النماذج والحماية من ثغرة الإسناد الجماعيCreating Updating Models and Mass Assignment Protection

حفظ وتحديث نماذج Eloquent عبر save و create وتأمين الأعمدة الحساسة ضد ثغرة الإسناد الجماعي باستخدام $fillable.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

لإدراج سجل جديد في قاعدة البيانات عبر كائن Eloquent مباشرة، أنشئ نسخة جديدة من النموذج وعين قيم الأعمدة كخصائص للكائن ثم استدعِ الدالة save. يتولى Eloquent تلقائياً تعبئة طابعي الإنشاء والتحديث وتعيين رقم المعرف المتزايد الجديد داخل الكائن.

  • الإنشاء والحفظ (new & save): إنشاء كائن جديد في الذاكرة وتعيين خصائصه ثم حفظه بجملة INSERT.
  • طوابع زمنية تلقائية (Auto Timestamps): تعبئة حقلي created_at و updated_at بالوقت الحالي تلقائياً عند الحفظ.
  • التحديث عبر save: عند جلب نموذج موجود وتعديل إحدى خصائصه ثم استدعاء save ينفذ الإطار جملة UPDATE.
مخطط معماري يوضح إنشاء وتحديث النماذج والحماية من ثغرة الإسناد الجماعي في إطار العمل Laravel 12
PHP
$flight = new Flight();
$flight->name = 'Cairo Express';
$flight->number = 'MS-777';
$flight->save();

// $flight->id and $flight->created_at are now set

يحدث الإسناد الجماعي عند تمرير مصفوفة من المفاتيح والقيم دفعة واحدة إلى دالتي create أو update لحفظ عدة أعمدة في خطوة واحدة. وبدون حماية مدمجة، قد يحقن مهاجم حقلاً إضافياً مثل صلاحية المدير is_admin=1 في طلب النموذج لترقية حسابه بشكل غير مشروع.

  • ثغرة الإسناد الجماعي (Mass Assignment): تلاعب المهاجم بحقول النموذج لإرسال أسماء أعمدة حساسة كالصلاحيات والرصيد.
  • الدرع الافتراضي: يمنع Eloquent الإسناد الجماعي لجميع الأعمدة افتراضياً حتى تحدد قائمة السماح بنفسك.
  • استثناء الحماية (MassAssignmentException): يُطلق فوراً عند محاولة استخدام create دون تعريف قائمة الحقول المسموحة.
PHP
// Unsafe if $request->all() has 'is_admin' => 1
// Always pair FormRequest and Model $fillable!
$clean = $request->validate([
    'name'   => ['required', 'string', 'max:80'],
    'number' => ['required', 'string', 'max:20'],
]);

لتفعيل الإسناد الجماعي الآمن داخل النموذج، عرف المصفوفة المحمية $fillable واكتب بداخلها أسماء الأعمدة المسموح بتعبئتها جماعياً فقط. ورغم وجود خاصية الحظر $guarded، يظل استخدام قائمة السماح الصريحة $fillable المعيار الأمني الأفضل لأن أي عمود يضاف مستقبلاً يبقى محمياً تلقائياً.

  • قائمة السماح ($fillable): تحديد صريح ودقيق لأسماء الأعمدة المسموح بتمريرها في مصفوفات الإنشاء والتحديث.
  • قائمة المنع ($guarded): تحديد الأعمدة الممنوعة، مع الحذر من إفراغها لأنه يعطل الحماية تماماً.
  • عزل الحقول الحساسة: استبعد دائماً أعمدة الصلاحيات والأرصدة المالية من مصفوفة $fillable.
PHP
class Flight extends Model
{
    protected $fillable = [
        'name',
        'number',
        'origin',
    ];
}

بعد ضبط مصفوفة السماح، تنشئ الدالة الساكنة Model::create السجل وتحفظه في سطر واحد، بينما تحدث دالة update بيانات النموذج الحالي. ويمكنك أيضاً فحص تغير خصائص الكائن في الذاكرة قبل الحفظ عبر دالتي isDirty و isClean، أو التحقق مما تم تعديله بعد الحفظ عبر دالة wasChanged.

  • الإنشاء المختصر (Model::create): تعبئة الحقول المسموحة وحفظ السجل في القاعدة وإرجاع الكائن في خطوة واحدة.
  • قبل الحفظ (isDirty & isClean): فحص ما إذا كانت خصائص الكائن في الذاكرة قد تغيرت عن قيمتها الأصلية قبل حفظها.
  • بعد الحفظ (wasChanged): التحقق من الأعمدة التي تم تعديلها فعلياً في قاعدة البيانات خلال آخر عملية حفظ.
PHP
$flight = Flight::create([
    'name' => 'Nile Star', 'number' => 'MS-101',
]);
$flight->name = 'Red Sea Star';
$dirty = $flight->isDirty('name'); // true
$flight->save();
$changed = $flight->wasChanged('name'); // true

كثيراً ما تحتاج للبحث عن سجل بحقل فريد كالمعرف النصي وإنشائه فقط إن لم يكن موجوداً، أو تحديثه إن وجد. تعيد دالة firstOrCreate السجل الموجود أو تنشئ سجلاً جديداً، بينما تقوم دالة updateOrCreate بتحديث السجل المطابق أو إدراج سجل جديد في خطوة واحدة أنيقة.

  • ابحث أو أنشئ (firstOrCreate): البحث بمعاملات المصفوفة الأولى، وعند غياب السجل يدمج المصفوفتين وينشئه فوراً.
  • حدث أو أنشئ (updateOrCreate): تحديث السجل المطابق بقيم المصفوفة الثانية أو إنشاؤه من جديد إن لم يوجد.
  • ابحث أو جهز (firstOrNew): إرجاع السجل الموجود أو تجهيز كائن جديد في الذاكرة دون حفظه حتى تستدعي save.
PHP
$flight = Flight::firstOrCreate(
    ['number' => 'MS-200'],
    ['name' => 'Luxor Shuttle', 'origin' => 'CAI']
);
$flight = Flight::updateOrCreate(
    ['number' => 'MS-200'],
    ['destination' => 'LXR']
);

يتطلب إتقان حفظ وتحديث النماذج في Eloquent الجمع بين قائمة السماح الصريحة $fillable والبيانات الموثوقة من الطلب مع اختيار دالة الإنشاء والتتبع المناسبة. راجع هذا الملخص لتوحيد أسلوب حفظ وتحديث البيانات في متحكمات تطبيقك.

وجه المقارنة الهندسيالأسلوب اليدوي أو غير المحميمعيار Laravel 12 الحديث
أمان الإسناد الجماعيتمرير مدخلات الطلب مباشرة للاستعلام مما يسمح بتزوير الصلاحياتحماية مزدوجة تجمع بين $request->validated ومصفوفة $fillable
إنشاء السجلاتكتابة جمل إدراج يدوية واستدعاء دالة جلب المعرف منفصلةاستدعاء واحد للدالة Model::create يعيد كائن النموذج كاملاً
تتبع تغير البياناتإعادة استعلام القاعدة لمقارنة القيم القديمة بالجديدة يدوياًدوال مدمجة في الذاكرة مثل isDirty و isClean و wasChanged
الإنشاء المشروطكتابة استعلام بحث يتبعه شرط يدوي للإدراج أو التحديثاستدعاء مختصر وآمن عبر دالتي firstOrCreate و updateOrCreate
PHP
public function store(StoreFlightRequest $request)
{
    $flight = Flight::create($request->validated());
    return redirect('/flights/' . $flight->id);
}
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس حول «إنشاء وتحديث النماذج والحماية من ثغرة الإسناد الجماعي» مفاهيم إنشاء وحفظ السجلات بالدالة save، ومفهوم ثغرة الإسناد الجماعي وخطورتها، وتأمين الحقول المسموحة عبر fillable وفق معايير Laravel 12 الحديثة.

الخطوة التالية والدرس القادم

انتقل الآن إلى الدرس التالي «حذف النماذج وتطبيق الحذف الناعم Soft Deletes في Laravel» للبناء التراكمي على ما تعلمته.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Mass Assignment الإسناد الجماعي
حفظ وتحديث نماذج Eloquent عبر save و create وتأمين الأعمدة الحساسة ضد ثغرة الإسناد الجماعي باستخدام $fillable.
للمراجعة
02 Inserting Records with Model Save إنشاء وحفظ السجلات بالدالة save
المفهوم الهندسي والتطبيق العملي المباشر لقسم إنشاء وحفظ السجلات بالدالة save في إطار العمل Laravel 12.
للمراجعة
03 Understanding Mass Assignment Security مفهوم ثغرة الإسناد الجماعي وخطورتها
المفهوم الهندسي والتطبيق العملي المباشر لقسم مفهوم ثغرة الإسناد الجماعي وخطورتها في إطار العمل Laravel 12.
للمراجعة
04 Allowlisting Columns with Fillable تأمين الحقول المسموحة عبر fillable
المفهوم الهندسي والتطبيق العملي المباشر لقسم تأمين الحقول المسموحة عبر fillable في إطار العمل Laravel 12.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 MVC MVC
Model View Controller
النمط المعماري الذي يفصل بين نماذج البيانات Models، وطبقات العرض Views، والمتحكمات Controllers في Laravel.
للمراجعة
02 CLI CLI
Command Line Interface
واجهة سطر الأوامر التي تعمل عبر أداة php artisan لتوليد الملفات وإدارة التطبيق.
للمراجعة
03 HTTP HTTP
Hypertext Transfer Protocol
بروتوكول نقل النص الفائق الذي ينظم طلبات المتصفح واستجابات خادم Laravel.
للمراجعة
04 PSR PSR
PHP Standards Recommendations
المعايير القياسية للغة PHP مثل التحميل التلقائي PSR-4 التي يلتزم بها إطار العمل Laravel.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. اكتب ونفّذ المثال البرمجي المشروح في قسم «إنشاء وحفظ السجلات بالدالة save» داخل مشروع Laravel 12 المحلي وتحقق من النتيجة.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم «مفهوم ثغرة الإسناد الجماعي وخطورتها» وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ما الهدف الهندسي الأساسي من إنشاء وحفظ السجلات بالدالة save في إطار العمل Laravel 12؟

يسهم إنشاء وحفظ السجلات بالدالة save في تنظيم منطق التطبيق بأسلوب معياري آمن وقابل للصيانة في Laravel 12.

02

يساعد الالتزام باصطلاحات Laravel 12 الرسمية في قسم «مفهوم ثغرة الإسناد الجماعي وخطورتها» على رفع جودة الكود وسهولة اختباره آلياً.

صواب؛ الالتزام بالمعايير القياسية في Laravel 12 يجعل الكود واضحاً وسهل الفحص والصيانة.

03

أي آلية في Laravel 12 تتولى إدارة تأمين الحقول المسموحة عبر fillable بشكل مباشر ومنظم؟

توفر طبقة إطار العمل وحاوية الخدمات في Laravel 12 الأدوات القياسية لإدارة تأمين الحقول المسموحة عبر fillable.

04

لماذا يُعد تطبيق الإنشاء والتحديث وتتبع تغير الخصائص مهماً عند بناء تطبيقات Laravel 12 جاهزة للإنتاج؟

لأنه يمنع الأخطاء البرمجية الخفية ويوحد سلوك التطبيق بين بيئتي التطوير والإنتاج.

05

في Laravel 12، يُنصح بكتابة مفاتيح الإنتاج السرية مباشرة داخل ملفات الكود المصدري المرفوعة إلى Git بدلاً من ملفات البيئة.

خطأ؛ يجب حفظ المفاتيح والبيانات السرية في متغيرات البيئة وعدم رفعها أبداً إلى مستودع Git.

06

ما المزايا الهندسية التي يحققها تطبيق الإدراج والتحديث المشروط بدون تكرار في Laravel 12؟ (اختر كل ما ينطبق)

يوفر فصلاً واضحاً للمسؤوليات، وأماناً أعلى أثناء التنفيذ، وتعاوناً أسهل بين أفراد الفريق.

07

يوظف إطار العمل Laravel 12 ميزات PHP 8 الحديثة مثل تحديد أنواع القيم المرجعة لجعل الكود أكثر وضوحاً وأماناً.

صواب؛ يعتمد Laravel 12 بشكل كامل على الصياغة الحديثة للغة PHP 8.2+ وسلامة الأنواع.

08

ما الفرق الجوهري بين معيار Laravel 12 الحديث والملفات اليدوية التقليدية في ملخص حفظ النماذج والحماية الأمنية؟

يوفر Laravel 12 واجهات قياسية موحدة وحماية مدمجة تغني عن الكود اليدوي المعرض للأخطاء.