تخطَّ إلى المحتوى

Mass Assignment

الإسناد الجماعي غير المقيَّد Mass Assignment

Mass Assignment تحدث عندما تربط ميزة "الربط التلقائي" بإطار العمل كل حقول جسم الطلب مباشرة بنموذج البيانات دون قائمة بيضاء، فيعدّل المستخدم حقولًا لم يُقصَد كشفها (مثل role أو isAdmin).

أطر عمل كثيرة توفّر راحة: تمرّر جسم JSON كاملًا لدالة إنشاء أو تحديث سجلّ، فتُربط كل مفاتيحه تلقائيًّا بحقول النموذج. لو أرسل المهاجم حقلًا إضافيًّا غير موجود بنموذج الواجهة (مثل `role: "admin"` أو `isVerified: true`) ولم يقيّد الخادم الحقول المسموح تعديلها، يُقبل هذا الحقل ويُطبَّق كأي حقل آخر.

الخطر يكمن في **الراحة** نفسها — الميزة تعمل بشكل صحيح تمامًا للاستخدام العادي، فلا يظهر خلل إلا عند اختبار حقول إضافية عمدًا.

الصياغة

Model.update(req.body)   // ❌ يربط كل حقول جسم الطلب دون تمييز

📄 مثال

// ✅ آمن: استخرج الحقول المسموحة صراحة (allowlist) قبل التحديث
function pickAllowedFields(body) {
  const { displayName, bio } = body;   // فقط ما يُسمح للمستخدم بتعديله
  return { displayName, bio };
}

await User.update(user.id, pickAllowedFields(req.body));
// role وisAdmin غير موجودين هنا مهما أرسل الطلب — غير قابلين للتعديل من هذا المسار

أهم النقاط

النقطةالوظيفة
القائمة البيضاءحدّد صراحة الحقول القابلة للتعديل من المستخدم، وتجاهل ما عداها
DTO منفصلكائن نقل بيانات مستقلّ عن نموذج قاعدة البيانات، يحوي فقط الحقول المقصودة
الأثر الشائعتصعيد صلاحيات (تعديل role) أو تلاعب بحقول لا يُفترض وصول المستخدم لها

💡 نصائح عملية

  • لا تعتمد على أن الواجهة الأمامية لا ترسل حقولًا حسّاسة — أي طلب HTTP يمكن تعديله يدويًّا بغضّ النظر عمّا ترسله الواجهة فعليًّا

⚠️ أخطاء شائعة

  • استخدام قائمة سوداء (استثناء حقول معيّنة) بدل قائمة بيضاء — أي حقل جديد يُضاف للنموذج لاحقًا يصبح قابلًا للتعديل تلقائيًّا ما لم يُستثنَ يدويًّا

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CYBERSECURITY الكامل بالعربي.