I'm always excited to take on new projects and collaborate with innovative minds.

Phone

+20 115 052 9992

Website

https://ibrahimahmed.online/

Social Links

إزاي تحمي الـ REST APIs من أخطر ثغرات الوصول غير المصرح به (BOLA و BFTA)

إزاي تحمي الـ REST APIs من أخطر ثغرات الوصول غير المصرح به (BOLA و BFTA) تخيل يا صديقي المبرمج إنك قضيت أسابيع بتبني تطبيق عظيم، والـ API شغال زي الفل، وفجأة تك

إزاي تحمي الـ REST APIs من أخطر ثغرات الوصول غير المصرح به (BOLA و BFTA)
Reading Count: 3

إزاي تحمي الـ REST APIs من أخطر ثغرات الوصول غير المصرح به (BOLA و BFTA)

تخيل يا صديقي المبرمج إنك قضيت أسابيع بتبني تطبيق عظيم، والـ API شغال زي الفل، وفجأة تكتشف إن أي مستخدم يقدر يشوف بيانات مستخدم تاني بمجرد ما يغير رقم في الـ URL! ده الكابوس اللي بيواجه أغلب المطورين لما يتجاهلوا "التحقق من الصلاحيات" (Authorization). النهاردة هنتكلم عن ثغرتين هما الأشهر في قائمة OWASP API Security وهما BOLA و BFTA.

يعني إيه أصلاً ثغرة الـ 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) هيفرق معاك جداً في مسارك المهني، وهيبني ثقة كبيرة بينك وبين عملائك أو شركتك.


Share

Related posts

Jun 25, 2026 • 1 min read
Reading Count: 6
إزاي تحسن أداء تطبيقات فلاتر (Flutter) الكبيرة باستخدام العزل (Isolates)

إزاي تحسن أداء تطبيقات فلاتر (Flutter) الكبيرة باستخدام العزل (Isolates) أكيد مريت بالموقف ده: بتبني...

Jun 25, 2026 • 1 min read
Reading Count: 8
مستقبل الـ Styling: ليه الـ CSS-in-JS بدأ يرجع لورا والـ Utility-First هو اللي سايق؟

مستقبل الـ Styling: ليه الـ CSS-in-JS بدأ يرجع لورا والـ Utility-First هو اللي سايق؟ لو أنت مبرمج Fr...

Jun 24, 2026 • 1 min read
Reading Count: 9
ازاي تخلي تجربة المستخدم في الـ Frontend سريعة مع Laravel Precognition

ازاي تخلي تجربة المستخدم في الـ Frontend سريعة مع Laravel Precognition أكيد مريت بالموقف ده كتير: ال...