إزاي تحمي الـ REST APIs من أخطر ثغرات الوصول غير المصرح به (BOLA و BFTA)
تخيل يا صديقي المبرمج إنك قضيت أسابيع بتبني تطبيق عظيم، والـ API شغال زي الفل، وفجأة تكتشف إن أي مستخدم يقدر يشوف بيانات مستخدم تاني بمجرد ما يغير رقم في الـ URL! ده الكابوس اللي بيواجه أغلب المطورين لما يتجاهلوا "التحقق من الصلاحيات" (Authorization). النهاردة هنتكلم عن ثغرتين هما الأشهر في قائمة OWASP API Security وهما BOLA و BFTA.
Table of contents [Show]
يعني إيه أصلاً ثغرة الـ BOLA؟
اختصار الـ BOLA هو (Broken Object Level Authorization). المشكلة هنا بتحصل لما الـ API بيتحقق إنك "مستخدم مسجل دخول" (Authentication)، بس بينسى يتحقق هل "المستخدم ده له الحق إنه يوصل للسجل (Record) ده بالذات ولا لأ".
مثلاً لو عندك URL زي ده: GET /api/v1/orders/1234. لو أنا مستخدم رقم 500، وقدرت أغير الرقم 1234 لـ 1235 وأشوف أوردر مش بتاعي، فأنا هنا استغليت ثغرة BOLA.
طيب إيه الفرق بينها وبين الـ BFTA؟
الـ BFTA اختصار لـ (Broken Function Level Authorization). هنا المشكلة مش في البيانات، المشكلة في "الوظيفة". يعني مثلاً مستخدم عادي (User) يقدر يوصل لـ Endpoint مخصصة للإدارة (Admin) زي DELETE /api/v1/users/delete_all. المبرمج هنا نسى يحط "طبقة حماية" (Access Control) تمنع غير الأدمن من تنفيذ الوظيفة دي.
إزاي تحمي الـ API بتاعك من الكوارث دي؟
الحل مش صعب، بس محتاج "نظام" (Mindset) في كتابة الكود. إليك الخطوات العملية:
1. التحقق من الملكية (Ownership Validation)
أوعى تثق في الـ ID اللي جاي من الـ Client أبداً. دايماً قارن بين الـ User ID الموجود في الـ Token (سواء JWT أو Session) وبين صاحب السجل في قاعدة البيانات.
// مثال كود (Pseudocode) بيبين الصح والغلط
// غلط:
app.get('/api/orders/:id', (req, res) => {
const order = db.getOrder(req.params.id);
res.json(order); // ممكن يرجع بيانات حد تاني!
});
// صح:
app.get('/api/orders/:id', (req, res) => {
const order = db.getOrder(req.params.id);
if (order.userId !== req.user.id) {
return res.status(403).send("مش من حقك تشوف الأوردر ده!");
}
res.json(order);
});
2. استخدم الـ UUID بدل الـ Sequential IDs
استخدام أرقام مسلسلة (1, 2, 3...) بيخلي المهاجم يتوقع الـ ID التالي بسهولة. استخدم الـ (Universally Unique Identifier) عشان تصعب عملية التخمين على أي حد يحاول يتلصص.
3. طبق نظام الصلاحيات (RBAC - Role Based Access Control)
لازم يكون عندك (Middleware) بيتحقق من دور المستخدم قبل ما ينفذ أي وظيفة حساسة. متعتمدش على الـ UI إنه يخفي زرار الـ "Delete" للمستخدم العادي، لأن المهاجم ممكن ينده الـ API مباشرة من الـ Postman.
نصيحة من أخ لمبرمج زميل
الأمن مش "ميزة" (Feature) بتضيفها في الآخر، الأمن هو "أساس" (Foundation) بتبني عليه تطبيقك. دايماً اتعامل مع أي طلب جاي للـ API بتاعك إنه "مشبوه" لحد ما يثبت العكس. جرب تعمل (Security Testing) يدوي على الـ APIs بتاعتك، وحاول تكسرها بنفسك قبل ما حد غريب يعمل كده.
تطوير مهاراتك في أمن البرمجيات (Cybersecurity) هيفرق معاك جداً في مسارك المهني، وهيبني ثقة كبيرة بينك وبين عملائك أو شركتك.