July 17, 2026
Broken access control
الويب أبلكيشن بيكون فيه مجموعة من القواعد والسياسات (Access Control Policies) بتحدد كل مستخدم أو Role يقدر يعمل إيه ويقدر يوصل لإيه.
By Ahmedzaki
2 min read
والـ Access Control ينقسم إلى 3 أنواع رئيسية:
1. Horizontal Access Control
وده معناه إن المستخدم يقدر يوصل لبيانات أو موارد تخص مستخدم تاني بنفس مستوى الصلاحيات (Same Privilege Level).
مثال:
أنت عندك حساب في البنك، تقدر تشوف تحويلاتك أنت فقط، ومينفعش تشوف تحويلات أي عميل تاني.
لكن لو قدرت تغير الـ ID أو رقم الحساب، وشفت تحويلات عميل تاني، فدي تعتبر Horizontal Access Control Vulnerability (أو Horizontal Privilege Escalation).
2. Vertical Access Control
وده أخطر من الأول.
هنا المهاجم بيحاول ينتقل من صلاحيات أقل إلى صلاحيات أعلى، يعني يعمل Privilege Escalation.
مثال:
أنت User عادي، لكن قدرت تدخل لوحة تحكم الـ Admin أو تستخدم API خاصة بالأدمن وتحذف أو تعدل بيانات.
في الحالة دي حصل Vertical Privilege Escalation.
3. Context-dependent Access Control
كلمة Context معناها الحالة الحالية للتطبيق أو المرحلة الحالية في الـ Workflow.
مثال بسيط:
أنت روحت السينما.
- اخترت الكرسي.
- دفعت.
- تم تأكيد الحجز.
بعد كده، هل المفروض تقدر تغير مكان الكرسي؟
الإجابة: لا.
لأن عملية الحجز انتهت بالفعل.
السيرفر المفروض يتأكد إن حالة الطلب أصبحت "Paid" أو "Completed"، وبالتالي يمنع أي تعديل.
لكن لو قدرت باستخدام Burp Suite تبعت Request لتغيير الكرسي بعد الدفع، واتغير فعلًا، فدي تعتبر Context-dependent Access Control Vulnerability.
المشكلة هنا إن السيرفر لم يتحقق من الحالة الحالية (Current State) للتطبيق قبل تنفيذ الطلب
How to Prevent Broken Access Control
1. Enforce access control on the server side
التأكد من الصلاحيات يكون على السيرفر، لأن المستخدم يقدر يعدل أي حاجة في الـ Browser أو يستخدم Burp Suite لإرسال Requests مباشرة.
2. Deny by default
اعمل Default Deny أو Whitelist.
يعني أي مستخدم يكون ممنوع من الوصول لأي Resource بشكل افتراضي، وبعدها تسمح فقط للمستخدمين أو الـ Roles المصرح لهم.
3. Implement access control once and reuse it
اعمل نظام صلاحيات واحد (Middleware أو Authorization Layer) واستخدمه في كل الـ Pages والـ APIs.
لأن لو المطور كتب كود الصلاحيات في كل صفحة، ممكن ينسى صفحة، وساعتها تظهر ثغرة.
4. Enforce record ownership
ودي من أهم النقط.
لو المستخدم غير الـ ID في الـ URL أو في الـ Request، السيرفر لازم يتحقق:
هل الـ Record ده يخص المستخدم الحالي؟
لو لأ، يرجع:
403 Forbidden403 Forbiddenوده بيمنع ثغرات IDOR.
5. Enforce business rules
السيرفر لازم يطبق قواعد التطبيق (Business Rules).
أمثلة:
- الكوبون يستخدم مرة واحدة فقط.
- الخصم لا يتكرر أكثر من المسموح.
- لا يمكن تعديل الطلب بعد الدفع.
- لا يمكن تنفيذ Refund مرتين.
6. Disable directory listing
امنع عرض الملفات والمجلدات الحساسة.
زي:
/backupdb.sql.git.envbackup.zip
لأنها ممكن تكشف معلومات حساسة عن التطبيق.
7. Log access control failures
سجل كل محاولات الوصول غير المصرح بها.
مثلاً سجّل:
- IP Address
- Username
- Time
- Requested URL
- Status Code
ولو تكررت المحاولات بشكل غير طبيعي، ابعت Alert للإدارة.
8. Rate limit requests
حدد عدد الـ Requests المسموح بها خلال فترة زمنية معينة.
وده بيقلل تأثير الهجمات الآلية مثل:
- Brute Force
- IDOR Enumeration
- API Abuse
ولو المستخدم تجاوز الحد، يرجع السيرفر:
429 Too Many Requests429 Too Many Requests9. Invalidate JWT after logout
بعد ما المستخدم يعمل Logout، لازم الـ JWT يصبح غير صالح (Invalid) على السيرفر، بحيث لو حد سرق التوكن قبل تسجيل الخروج، ميقدرش يستخدمه بعد كده.