طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 245 · ضمان جودة تطبيقات الويب
الدرس 21 · الوحدة 11: الأدوات في الاختبارات الشاملة

اختبار الأمان: OWASP ZAP و Burp Suite

الجودة تشمل الأمان؛ كيف نختبر أن التطبيق يصدّ الهجوم؟ ⏱ نحو 45 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تدرك الأمان جزءًا من ضمان الجودة.
  • تحوّل الثغرات إلى حالات اختبار.
  • تعرف OWASP ZAP و Burp وأنواع اختبار الأمان.
  • تلتزم الإطار القانونيّ والأخلاقيّ.

١الجودة تشمل الأمان

تطبيقٌ سريعٌ صحيحٌ لكنه مخترَق ليس عالي الجودة. اختبار الأمان جزءٌ من ضمان الجودة: نبحث عن الثغرات (التي درستَها في مقرر أمن الويب) قبل أن يجدها المهاجم. نكتب حالاتٍ تحاول كسر التطبيق كما يفعل الخصم.

الأداةالدور
OWASP ZAPفاحص ثغرات مجّانيّ مفتوح: يزحف ويهاجم آليًّا
Burp Suiteمنصّة اختبار أمان احترافية (وكيل، فاحص، متلاعب)
اختبار يدويّحالات نكتبها لثغراتٍ محدّدة (حقن، XSS…)

٢اختبار أمان كحالة اختبار

كل ثغرةٍ نحوّلها إلى حالة اختبار: مدخلٌ خبيث، والمتوقَّع أن يرفضه التطبيق أو يطهّره. نختبر الدفاع كما نختبر أيّ سلوك:

main.py
# دالة تهرب من حقن SQL باستخدام قيمٍ معلَّمة (محاكاة)def safe_query(name):    # ترفض محاولات الحقن الواضحة وتعيد استعلامًا آمنًا    forbidden = ["'", ";", "--", " OR "]    if any(f in name.upper() for f in [x.upper() for x in forbidden]):        return None            # رُفِض    return f"SELECT * FROM users WHERE name = ?  [{name}]" # حالات اختبار أمانcases = [    ("سارة", True),                        # اسم عاديّ يُقبَل    ("x' OR '1'='1", False),               # حقن يُرفَض    ("admin--", False),                    # تعليق حقن يُرفَض]passed = 0for name, should_pass in cases:    result = safe_query(name)    ok = (result is not None) == should_pass    passed += ok    print(f"{'✓' if ok else '✗'}  {name!r}: {'قُبِل' if result else 'رُفِض'}")print("نجح", passed, "من", len(cases))
Shell×
>>> %Run main.py
✓ 'سارة': قُبِل
✓ "x' OR '1'='1": رُفِض
✓ 'admin--': رُفِض
نجح 3 من 3
>>>

الاختبار الأمنيّ يتأكّد أن الدفاع يعمل: الاسم العاديّ يمرّ، ومحاولات الحقن تُرفَض. لو مرّت محاولة حقنٍ، فذلك عيبٌ أمنيّ حرج.

٣أنواع اختبار الأمان

النوعيفعل
الفحص الآليّ SAST/DASTأدوات تمسح الكود أو التطبيق الحيّ بحثًا عن ثغرات
اختبار الاختراق Pentestخبيرٌ يهاجم النظام بإذنٍ ليكشف نقاط الضعف
مراجعة الكود الأمنيةقراءة الكود بحثًا عن أنماطٍ خطرة

توقّع وتحقّق

اختبار الأمان جزء من:

فاحص ثغرات مفتوح المصدر:

اختبار الأمان يحوّل كل ثغرةٍ إلى:

اختبار موقعٍ لا تملكه دون إذن:

الخلاصة

تحدٍّ برمجي: اختبر الدفاع

متقدم

الدالة reject_xss ترفض المدخل إن احتوى <script. اختبرها: الاسم العاديّ يُقبَل، والمدخل الخبيث يُرفَض. اطبع عدد الحالات الناجحة.

المطلوب:
  • مرّ على الحالات: عاديّ مقبول، وخبيث مرفوض.
  • اطبع عدد الحالات الناجحة.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
def reject_xss(text):    return "<script" not in text.lower()   # True = مقبولcases = [("مرحبا", True), ("<script>بث</script>", False), ("عادي", True)]# اطبع عدد الحالات الناجحة
المطلوب×
3
💡 تلميح 1
sum(1 for t, exp in cases if reject_xss(t) == exp).
💡 تلميح 2
المدخل الخبيث يحوي