الرئيسية المنتدى مركز رفع الصور صفحتنا على الفيس قناة اليوتيوب صفحتنا على تويتر واتس اب قوانين المنتدى
منتدى مجمع التطوير    

العودة   منتدى مجمع التطوير > المنتدى المتخصص > لغـات البرمجـة والمشـاريع الجـاهزة > برمجة الويب web development

الملاحظات

برمجة الويب web development يهتم ببرامج الويب php, Sql, Java ,asp.net ,xml ,html

آخر 10 مشاركات مواقع للحصول على باك لينكس عالية (الكاتـب : admin - آخر مشاركة : سنبول - مشاركات : 1 - المشاهدات : 1067 - الوقت: 10:19 PM - التاريخ: 09-23-2021)           »          التقليد المذموم (الكاتـب : admin - مشاركات : 0 - المشاهدات : 280 - الوقت: 06:44 PM - التاريخ: 09-06-2021)           »          الخداع (الكاتـب : admin - مشاركات : 0 - المشاهدات : 202 - الوقت: 06:43 PM - التاريخ: 09-06-2021)           »          إعلانات شركة Admaven (الكاتـب : سنبول - مشاركات : 0 - المشاهدات : 339 - الوقت: 04:20 PM - التاريخ: 08-26-2021)           »          جدار روحك يريد أن ينقض (الكاتـب : admin - مشاركات : 0 - المشاهدات : 369 - الوقت: 11:27 PM - التاريخ: 08-23-2021)           »          سعر الذهب في مصر وعالميا صباح اليوم الخميس 12 أغسطس 2021 (الكاتـب : admin - مشاركات : 0 - المشاهدات : 375 - الوقت: 02:58 PM - التاريخ: 08-12-2021)           »          تأملت والدنيا (الكاتـب : admin - مشاركات : 0 - المشاهدات : 431 - الوقت: 10:54 PM - التاريخ: 08-03-2021)           »          وكن راضيا (الكاتـب : admin - مشاركات : 0 - المشاهدات : 411 - الوقت: 10:54 PM - التاريخ: 08-03-2021)           »          طوبا لمن عاش في هذه الدنيا غريبا (الكاتـب : admin - مشاركات : 0 - المشاهدات : 424 - الوقت: 10:53 PM - التاريخ: 08-03-2021)           »          لا تشكُ للناسِ (الكاتـب : admin - مشاركات : 0 - المشاهدات : 432 - الوقت: 10:52 PM - التاريخ: 08-03-2021)

إضافة رد
 
أدوات الموضوع انواع عرض الموضوع
  #1  
قديم 05-28-2021, 03:41 AM
الصورة الرمزية الادارة كريم
الادارة كريم 
مشرف سابق
 
تاريخ التسجيل: May 2021
الدولة: مصر
المشاركات: 397
معدل تقييم المستوى: 22
الادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to beholdالادارة كريم is a splendid one to behold


افتراضي الإدخال والتعديل بشكل آمن في لارافيل ومشكلة Mass-Assignment

 

مقدمة

توفر لارافيل طرقا سهلة للتعامل مع قواعد البيانات باستخدام Eloquent ORM بحيث تمثل الجداول فيه على شكل Models ويصبح التعامل معه سهلا جدا باستخدام بعض الدوال الجاهزة Methods، ومن العمليات المهمة التي نستخدمها دائما في أي مشروع، عملية الإدخال (Insertion/Creation) والتعديل (Edit/Update)، وتوفر لارافيل طرقا سهلة لفعل ذلك، وللتوضيح فقط في هذا الدرس، سنفترض وجود Model باسم User، له الخصائص الآتية:

  • id وهو الـ Primary Key
  • name
  • email
  • password
  • bio: وصف مختصر للمستخدم، وهي قيمة اختيارية ( لن نجبر المستخدم على ادخالها ) لكنها لا تقبل null، قيمتها الافتراضية string فارغ ' '
  • is_admin قيمتها true في حال كان العضو مديرا
$user = new User(); $user->name = $request['name']; $user->email = $request['email']; $user->password = bcrypt($request['password']); // لكلمة المرور Hashing هي دالة مساعدة تقوم بعمل bcrypt if( $request->has('bio') ) $user->bio = $request['bio']; $user->save();
قمنا بتعيين الاسم والبريد الالكتروني وكلمة المرور وجلبنا قيمهم من الـ Request وكذلك الحال بالنسبة لـ bio، لكن بما ان bio اختيارية، فقد لا يدخلها المستخدم، فوضعنا الشرط للتحقق من وجودها، فلو لم نضع الشرط ولم يدخلها المستخدم فسيتم ادخال القيمة null، والخاصية لا تقبل هذه القيمة كما اتفقنا مسبقا.
ثم قمنا بتخزين الـ Instance الجديد من المودل User في قاعدة البيانات، والطريقة مشابهة للتعديل، فمثلا لتعديل الاسم سنقوم بكتابة الكود الآتي ( على افتراض أننا جلبنا الـ user ووضعناه في المتغير user$ ):
$user->name = $request['name']; $user->save(); مشكلة هذه الطريقة في الانشاء والتعديل أنها تحتاج لكتابة كود طويل في حال وجود كثير من الأعمدة في جدول users، لذلك توفر لارافيل طريقة أسهل لإدخال جميع الخصائص دفعة واحدة وهو ما يعرف بـ (Mass Assignment)، في الكود الآتي مثال على طريقة الانشاء وطريقة التعديل:
// الانشاء $user = User::create($request->all()) // التعديل $user->fill($request->all())
بهذه البساطة فقط يمكن الانشاء والتعديل دون الاضطرار لتعيين كل خاصية وحدها، فالميثود create والميثود fill تستقبل مصفوفة (array) يكون الـ key فيها عبارة عن اسم العمود، والـ value هي القيمة التي سيتم تعيينها.

في الغالب، عندما تستخدم طريقة الـ Mass Assignment، لن تعمل معك وستحصل على الخطأ MassAssignmentException، فما السبب في ذلك؟
هذا الخطأ يظهر لدواعٍ أمنية، فالـ Mass Assignment خطيرة بعض الشيء في حال استخدمتها بطريقة خاطئة، لذلك تتخذ لارافيل بعض الاجراءات الامنية وطرق الوقاية من الثغرة التي تسببها Mass Assignment، فتظهر لك هذا الـ Exception في حال لم تتخذ الإجراءات الوقائية المناسبة، لكن قبل الحديث عن الإجراءات الوقائية، يجب أن نفهم الثغرة بشكل واضح حتى نتمكن من حماية أنفسنا منها.
ما هي مشكلة الـ Mass Assignment

في المثال السابق، مررنا جميع محتويات الـ Request إلى دالة create و fill، وفي ذلك عدة فوائد، منها عدم الاضطرار إلى كتابة جميع القيم وتعديلها أو انشاؤها يدويا، كذلك التخلص من الشروط التي تتحقق من ادخال القيم الافتراضية، كالشرط الذي وضعناه لخاصية bio، فبشكل تلقائي، إن لم تحتوي الـ Request على bio فلن تكون موجودة في الـ array التي تم تمريرها وسنتخلص من هذه المشكلة.
لكن إدخال جميع محتويات الـ Request يؤدي إلى مشكلة كبيرة، فكما تعلم، يمكنك أن تقوم بإنشاء Http Request من خلال بعض الأدوات، أو من خلال التلاعب بالـ Form في HTML في المتصفح، فبإمكاني مثلا الدخول إلى موقعك، والتلاعب بالـ Request لتعديل قيمة الـ id مثلا، والمفروض أنني لا أمتلك صلاحيات لفعل ذلك، أو يمكنني التلاعب بالـ Request وأرسل القيمة true للمفتاح is_admin على الرغم من أنك في الأساس لم تضعه ضمن الـ Form، فهذا سيمكنني من الحصول على صلاحيات الإدارة في الموقع.
هذه مثلا أداة تمكنني من إنشاء Http Request، لاحظ كيف أستطيع تحديد الحقول التي أحتاجها، ومنها is_admin:

بالطبع هذه الـ Request لن تعمل على تطبيق لارافيل لأن لارافيل توفر طريقة سهلة لحماية الحقول التي لا تريد لأحد التلاعب بها أو تعديلها، وهذه الطريقة مفعلة بشكل افتراضي، لكنها تحتاج إلى بعض التعديل بحسب خصائص المستخدم لديك، لذلك ستحصل على الخطأ MassAssignmentException في حال لم تقم بما يلزم لحماية الـ Request من التلاعب.

حل المشكلة

لو قمت بفتح الـ Model الخاص بالمستخدم (User) الذي يأتي جاهزا مع لارافيل، ستجد مصفوفة باسم fillable$ وفيها بعض الخصائص:

لاحظ التعليق الذي يسبق المصفوفة " The attributes that are mass assignable " أي أن الخصائص الموجودة اسماؤها داخل المصفوفة هي الخصائص التي يُسمح بتعيينها باستخدام الـ Methods التي تدخل البيانات بشكل جماعي ( create و fill ) ففي حال قمت بعمل Request تحتوي فقط على name و email و password فإن الـ Request ستعمل دون مشاكل وستتم الإضافة أو التعديل باستخدام create او fill دون أن تواجه أي مشكلة، لكن لو كانت الـ Request تحتوي على الخصائص السابقة إضافة إلى bio مثلا أو is_admin، فستحصل على مشكلة MassAssignmentException لأن bio و is_admin غير موجودتان في مصفوفة fillable.
لذلك في حال أردت استخدام Mass Assignment Method كـ create أو fill، فإن عليك اضافة أي عنصر تريد أن يكون قابلا للتعديل إلى مصفوفة fillable،
في بعض الحالات تكون لديك الكثير من الأعمدة في الجدول، ومعظمها قابلة للتعديل، فبدلا من إضافتها كلها إلى fillable، قم بحذف المصفوفة واستخدم بدلا منها مصفوفة guarded$.
وهي تقوم بنفس العمل لكن بشكل عكسي، فبدلا من وضع الخصائص التي تريد أن تكون قابلة للتعديل، تضع الخصائص التي تريدها أن تكون محمية وغير قابلة للتعديل، فمثلا يمكن استخدام احدى المصفوفتين كالآتي على مثالنا السابق:

protected $fillable = [ 'name', 'email', 'bio', 'password' ]; // أو protected $guarded = [ 'is_admin', 'id' ];
* تحذير: لا تقم باستخدام fillable$ و guarded$ في وقت واحد، قم باستخدام واحدة فقط.

كما ترى، بهذه الطريقة يمكن الاطمئنان إلى استخدام Mass Assignment دون الخوف من التلاعب بالـ Request، فلو تلاعب أي شخص بالـ Request وقام بمحاولة تعديل is_admin مثلا، فسيحصل على MassAssignmentException ولن يتم التعديل.

لكن قبل أن نختم، قد يتبادر إلى ذهنك تساؤل بسيط، هل بوضعنا لـ is_admin في مصفوفة guarded$ فلن نتمكن من تعديلها أبدا ؟
بل بإمكانك تعديل هذه القيم، لكن ليس باستخدام create أو fill، بل باستخدام الطريقة الأولى للتعديل، بل بامكانك استخدام fill، مع الطريقة الاولى بسهولة للسماح مثلا للـ Admin الخاص بالموقع بتعديل is_admin، ومنع باقي الأعضاء من تعديلها، شاهد هذا المثال:
$user->fill($request->except('is_admin')); if(Auth::user()->is_admin && $request->has('is_admin')) { $user->is_admin = $request['admin']; $user->save(); }
لاحظ أننا في هذا المثال قمنا باستخدام الطريقتين في وقت واحد، أولا قمنا بعمل fill لجميع محتويات الـ Request باستثناء is_admin، ثم استخدمنا الطريقة الأولى للتعديل لكن بعد التحقق من أن المستخدم المسجل حاليا ( الذي يقوم بالتعديل ) يملك صلاحيات Admin، إضافة إلى وجود is_admin في الـ Request.

لكن في حال قمت أنا بالدخول إلى موقعك ( وأنا لست admin ) وحاولت التلاعب بالـ Request ومحاولة تعديل is_admin، فإن الشرط الأول سيمنعني، أما إن حاولت التلاعب بها لتعديل الـ id الخاص بي مثلا فلن يتم التعديل وسيظهر لي خطأ MassAssignmentException.


الموضوع الأصلي : الإدخال والتعديل بشكل آمن في لارافيل ومشكلة Mass-Assignment || الكاتب : الادارة كريم || المصدر : منتدى مجمع التطوير

 

رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)

أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع

 

موقع ومنتديات مجمع التطوير موقع يختص بالبرمجة والبرامج المساعدة  للتصاميم والأدوات المساعدة ,مع تقديم العون والمساعدة لكل مبرمج من خلال الأقسام المحددة , كما نعرض الأعمال الجاهزة والمفتوحة المصدر. ويهتم أيضا بالتصاميم والجرافيك وبرامجها وعرض التصاميم وملحقات التصاميم والأدوات المساعدة .كما نتمنى التوفيق لنا ولكم مع أجمل تحية مقدمة منا. 

  • الرئــيســية

  • الــمنــتـدى

  • مركز الرفع

  • التسـجـيل

  • قوانين المنتدى

  • التعـلـيمـات

  • الترقيات

check pagerank

 Flag Counter

كلمة الإدارة  منتدى مجمع التطوير غير مسئول عن أي طرح من الأعضاء فتلك الموضوعات تعبر عن رأى صاحبها ومن خلال وضع قوانين وتعليمات المشاركة بالمنتدى نسعى جاهدين لتطبيق تلك التعليمات. والمنتدى أيضا غير مسئول عن أي اتفاق مالي أو تجارى بين الأعضاء وبذلك تعد هذه الصيغة إخلاء مسئولية من جانب إدارة المنتدى وفقنا ووفقكم الله لما فيه الخير
 
الساعة الآن 10:19 PM


Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
جميع الحقوق محفوظة لمجمع التطوير