BOLA
كسر التفويض على مستوى الكائن BOLA
API1:2023 — المستخدم يصل لبيانات كائن لا يملكه فقط لأنه غيّر معرّف (ID) في الطلب، والخادم لم يتحقق من ملكيته.
BOLA (Broken Object Level Authorization) أشهر ثغرة في الـ API Security Top 10 وتحتل المركز الأول منذ نسخة 2019 وحتى نسخة 2023. تحدث عندما يتحقق الخادم من أن المستخدم مسجّل دخول (Authentication) لكنه ينسى التحقق من أن هذا المستخدم يملك صلاحية على الكائن المحدد بالـ ID (Authorization).
الفرق عن Broken Function Level Authorization: BOLA تتعلّق بكائن محدد (طلب/فاتورة/ملف رقم كذا)، بينما BFLA تتعلّق بوظيفة كاملة (مسار إداري لا يجب أن يصل له مستخدم عادي).
الصياغة
GET /api/resource/{id} → تحقق: هل resource[id].ownerId === currentUser.id ؟📄 مثال
// ثغرة
app.get('/api/invoices/:id', authenticate, async (req, res) => {
const invoice = await db.invoice.findUnique({ where: { id: req.params.id } });
res.json(invoice); // لا يتحقق من أن الفاتورة تخص req.user
});
// إصلاح
app.get('/api/invoices/:id', authenticate, async (req, res) => {
const invoice = await db.invoice.findUnique({ where: { id: req.params.id } });
if (!invoice || invoice.ownerId !== req.user.id) {
return res.status(404).json({ error: 'غير موجود' });
}
res.json(invoice);
});أهم النقاط
| النقطة | الوظيفة |
|---|---|
| الاختبار | جرّب تغيير الـ ID برقم كائن مستخدم آخر وشاهد هل يرجع بيانات فعلية |
| المكان الشائع | أي مسار فيه {id} في الرابط: /users/:id، /orders/:id، /files/:id |
| الحل الأساسي | تحقّق من الملكية على مستوى قاعدة البيانات (WHERE ownerId = currentUser.id) وليس فقط بالكود |
💡 نصائح عملية
- استخدم معرّفات صعبة التخمين (UUID) بدل أرقام متسلسلة — يقلّل المخاطرة لكنه لا يغني عن التحقق من الصلاحية
⚠️ أخطاء شائعة
- الاعتماد على أن الـ ID 'صعب التخمين' كحماية وحيدة بدل التحقق الصريح من الملكية
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار API-SECURITY الكامل بالعربي.