أمن تطبيقات الويب: OWASP Top 10:2025
درس 3 من 4
3أمن تطبيقات الويب: OWASP Top 10:2025
الصورة الكبيرةتطبيق الويب مثل موظف استقبال ينفّذ ما يُكتب له في نموذج. إذا لم يتحقق مما يُكتب، قد يكتب له محتال «وأعطني ملفات كل العملاء» فينفّذ. وأشهر المشاكل ليست عبقرية: صفحة تعرض بيانات عميل آخر إذا غيّرت رقمًا في الرابط.
ماذا تشاهد في الرسم: نفس الطلب بتغيير رقم واحد. إذا لم يسأل الخادم «هل هذه الفاتورة لك؟» في كل مرة، يرى أي مستخدم فواتير الجميع. هذه الفئة الأولى في القائمة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
القاعدة الذهبية: لا تثق بأي شيء يأتي من المستخدم. الرقم في الرابط، والنص في الخانة، والملف المرفوع، كلها قد تكون فخًا. الخادم يجب أن يتحقق بنفسه في كل مرة: من أنت، وهل يحق لك، وهل ما كتبته بيانات بريئة أم أمر متنكر.
OWASP Top 10:2025: A01 Broken Access Control، A02 Security Misconfiguration، A03 Software Supply Chain Failures (جديدة وموسّعة)، A04 Cryptographic Failures، A05 Injection (تشمل XSS)، A06 Insecure Design، A07 Authentication Failures، A08 Software or Data Integrity Failures، A09 Security Logging and Alerting Failures، A10 Mishandling of Exceptional Conditions (جديدة). الدفاعات: التفويض في الخادم ومنع افتراضي، والاستعلامات المهيّأة وترميز المخرجات حسب السياق وCSP، وSBOM وتثبيت الإصدارات، ونمذجة التهديدات، والفشل المغلق (Fail Closed). وفي درب، يأخذك جزء «أمان التطبيقات» في المرحلة 3 أعمق في الكود.
قبل أن تبدأ
🌐الخادم والواجهات البرمجية (المرحلة 1)
تعرف ما الطلب والرد وقاعدة البيانات.
🔑الهوية وكلمات المرور
المصادقة والجلسات.
الفكرة الجوهرية
1القائمة كاملة بمثال لكل بند
قائمة OWASP هي المرجع الأشهر لأخطر عشر فئات في تطبيقات الويب، وتُحدَّث كل بضع سنوات من بيانات اختبارات حقيقية. لا تحفظ الأرقام؛ افهم الفكرة وراء كل بند ودفاعها.
| الرمز | الفئة | مثال سريع | الدفاع الأساسي |
|---|---|---|---|
| A01 | Broken Access Control | تغيير /invoice/1001 إلى 1002 فتظهر فاتورة غيرك | تحقق الصلاحية في الخادم لكل طلب، والمنع افتراضيًا |
| A02 | Security Misconfiguration | لوحة إدارة مكشوفة أو حاوية تخزين عامة | إعدادات صلبة موحدة ومراجعة آلية |
| A03 | Software Supply Chain Failures | مكتبة npm مخترقة تدخل مشروعك | جرد المكونات (SBOM) وتثبيت الإصدارات وفحص الاعتماديات |
| A04 | Cryptographic Failures | كلمات مرور مخزنة بـ MD5 | خوارزميات حديثة وإدارة صحيحة للمفاتيح |
| A05 | Injection | حقن SQL أو أوامر نظام أو XSS | استعلامات مهيّأة وترميز المخرجات |
| A06 | Insecure Design | استعادة كلمة مرور بسؤال جوابه منشور | نمذجة التهديدات قبل البناء |
| A07 | Authentication Failures | لا حد لمحاولات الدخول | MFA وتقييد المحاولات وجلسات آمنة |
| A08 | Software or Data Integrity Failures | تحديث يُنزَّل دون التحقق من توقيعه | التوقيع والتحقق في خط النشر |
| A09 | Security Logging and Alerting Failures | هجوم استمر أشهرًا لأن لا أحد يراقب السجلات | سجلات مركزية وتنبيهات قابلة للتنفيذ |
| A10 | Mishandling of Exceptional Conditions | رسالة خطأ تكشف تفاصيل قاعدة البيانات، أو نظام «يفتح» عند الفشل | معالجة أخطاء موحدة والفشل المغلق |
2A01: كسر التحكم بالوصول
هذه الفئة الأولى لأنها الأكثر انتشارًا وأسهلها استغلالًا: يكفي أن تغيّر رقمًا. الخطأ الشائع أن المطوّر يخفي الزر في الواجهة ويظن أن المستخدم لن يصل للصفحة. لكن المهاجم لا يستخدم واجهتك؛ يرسل الطلب مباشرة. التحقق مكانه الخادم، في كل طلب.
3A05: الحقن، وجرّبه بنفسك
الحقن يحدث حين يدخل نص المستخدم في أمر يُنفَّذ، فيتحول جزء منه إلى أوامر. القاعدة لكل أنواعه: افصل الأوامر عن البيانات.
الاستعلام غير الآمن أعاد كل الصفوف، والمهيّأ لم يُعد شيئًا لأن النص بقي نصًا. غيّر typed إلى بريد سارة وشغّل.
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE users (email TEXT, secret TEXT)")
db.executemany("INSERT INTO users VALUES (?, ?)",
[("sara@example.com", "salary 18,000"), ("omar@example.com", "salary 21,500")])
typed = "' OR '1'='1" # what an attacker types in the email box
unsafe = "SELECT * FROM users WHERE email = '" + typed + "'"
print("unsafe:", db.execute(unsafe).fetchall())
safe = db.execute("SELECT * FROM users WHERE email = ?", (typed,)).fetchall()
print("safe: ", safe)وXSS هو الحقن نفسه لكن في المتصفح: نص المستخدم يُعرض في الصفحة كأنه كود JavaScript. الدفاع ترميز المخرجات حسب مكان عرضها، وسياسة أمن المحتوى (CSP).
4الجديد في 2025: سلسلة التوريد والفشل الآمن
مشروعك الحديث 80% منه أو أكثر كود كتبه غيرك: مكتبات npm وpip. A03 تقول إن مكتبة مخترقة واحدة تكفي. الدفاع: اعرف ما تستخدمه (SBOM)، وثبّت الإصدارات، وافحص الاعتماديات تلقائيًا. وA10 الجديدة عن الأخطاء: النظام الذي «يفتح» حين يتعطل، مثل باب إلكتروني ينفتح عند انقطاع الكهرباء، خطر. افشل مغلقًا.
مثال محلول
المسألة: في تطبيق متجر، رابط الطلب /orders/5521. صمّم فحصًا يمنع A01.
الحل: في الخادم، بعد التحقق من هوية المستخدم من جلسته (لا من الرابط)، اجلب الطلب ثم قارن مالكه بالمستخدم الحالي: إن لم يطابق، أعد 404 لا 403 حتى لا تكشف أن الطلب موجود. ضع هذا الفحص في مكان واحد يمر به كل مسار، واكتب له اختبارًا آليًا يحاول فتح طلب مستخدم آخر ويتوقع الرفض.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| إخفاء الزر في الواجهة يكفي لمنع الوصول. | المهاجم يرسل الطلب مباشرة بلا واجهتك؛ التحقق مكانه الخادم. |
| الإطار الحديث يحميني من كل شيء. | يحميك من بعض الحقن افتراضيًا، لكنه لا يعرف من يملك أي طلب، ولا يمنع إعدادًا خاطئًا. |
أين تقابله في العمل
🧑💻مطوّر
يكتب فحص الملكية واستعلامات مهيّأة من أول يوم، ويفحص اعتمادياته في CI.
🐞باحث ثغرات
يجرب تغيير المعرّفات والمدخلات في برامج المكافآت المصرّح بها.
اختبر فهمك
تغيير رقم الفاتورة في الرابط فتظهر فاتورة عميل آخر مثال على:
الخادم لم يتحقق أن الفاتورة تخص المستخدم الحالي. وهي A01 في OWASP 2025.
أفضل دفاع ضد حقن SQL:
الاستعلام المهيّأ يفصل الأمر عن البيانات من الأساس. الباقي طبقات مساعدة.
أي فئة جديدة في 2025 تتعلق بسلوك النظام عند الأخطاء؟
A10 عن الأخطاء التي تكشف معلومات أو تجعل النظام يفتح عند الفشل.
ما الدفاع الأساسي ضد حقن SQL؟
البيانات تمر منفصلة عن الأمر فلا تُنفَّذ.
مستخدم يغيّر رقم الطلب في الرابط فيرى طلب غيره. أي فئة؟
هذا IDOR: الخادم لم يتحقق من الملكية.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا تُعيد 404 لا 403 حين يطلب مستخدم طلب غيره؟
حتى لا تؤكد للمهاجم أن الطلب موجود، فلا يعرف أي الأرقام حقيقية.
ما القاعدة المشتركة لكل أنواع الحقن؟
افصل الأوامر عن البيانات، وتحقق من المدخلات في الخادم، ورمّز المخرجات حسب مكان عرضها.
لماذا لا يكفي إخفاء زر «حذف» عن المستخدم العادي؟
لأن المهاجم يرسل الطلب مباشرة دون واجهة. الصلاحية تُفحص في الخادم مع كل طلب.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
course1
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.