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

BFLA

كسر التفويض على مستوى الوظيفة BFLA

API5:2023 — مستخدم عادي يستطيع استدعاء وظيفة مخصصة للمشرفين فقط، عادة لأن الفحص كان في الواجهة الأمامية فقط لا في الخادم.

على عكس BOLA (كائن واحد محدد بـ ID)، BFLA تتعلق بوظيفة كاملة — غالبًا endpoint إداري مثل حذف مستخدم أو تعديل الصلاحيات. السبب الشائع: المطوّر يخفي زر 'حذف' في الواجهة عن غير المشرفين، لكن الـ endpoint نفسه بالخادم يبقى بلا تحقق، فيستدعيه أي مستخدم مباشرة عبر الطلب.

الصياغة

app.METHOD('/api/admin/...', requireRole('admin'), handler)

📄 مثال

// سيئ — أي مستخدم مسجّل دخول يقدر يحذف
app.delete('/api/users/:id', authenticate, async (req, res) => {
  await User.delete(req.params.id);
  res.sendStatus(204);
});

// جيد — تحقق صريح من الدور
function requireRole(role) {
  return (req, res, next) => {
    if (req.user.role !== role) return res.status(403).json({ error: 'ممنوع' });
    next();
  };
}
app.delete('/api/users/:id', authenticate, requireRole('admin'), async (req, res) => {
  await User.delete(req.params.id);
  res.sendStatus(204);
});

أهم النقاط

النقطةالوظيفة
القاعدةكل endpoint يفترض دورًا معينًا يجب أن يتحقق من الدور بالخادم، لا بالواجهة فقط
الاختباراستدعِ مسارات الإدارة مباشرة (curl/Postman) بحساب مستخدم عادي

💡 نصائح عملية

  • جمّع مسارات الإدارة تحت بادئة واحدة (/api/admin/*) وطبّق middleware صلاحيات على البادئة كاملة بدل كل مسار على حدة

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

  • الاعتماد على إخفاء الزر أو الرابط بالواجهة فقط — أي مسار API معروف قابل للاستدعاء المباشر

خصائص ذات صلة

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