اختبار الأمان: OWASP ZAP و Burp Suite
الجودة تشمل الأمان؛ كيف نختبر أن التطبيق يصدّ الهجوم؟ ⏱ نحو 45 دقيقة.
- تدرك الأمان جزءًا من ضمان الجودة.
- تحوّل الثغرات إلى حالات اختبار.
- تعرف
OWASP ZAPوBurpوأنواع اختبار الأمان. - تلتزم الإطار القانونيّ والأخلاقيّ.
١الجودة تشمل الأمان
تطبيقٌ سريعٌ صحيحٌ لكنه مخترَق ليس عالي الجودة. اختبار الأمان جزءٌ من ضمان الجودة: نبحث عن الثغرات (التي درستَها في مقرر أمن الويب) قبل أن يجدها المهاجم. نكتب حالاتٍ تحاول كسر التطبيق كما يفعل الخصم.
| الأداة | الدور |
|---|---|
| OWASP ZAP | فاحص ثغرات مجّانيّ مفتوح: يزحف ويهاجم آليًّا |
| Burp Suite | منصّة اختبار أمان احترافية (وكيل، فاحص، متلاعب) |
| اختبار يدويّ | حالات نكتبها لثغراتٍ محدّدة (حقن، XSS…) |
٢اختبار أمان كحالة اختبار
كل ثغرةٍ نحوّلها إلى حالة اختبار: مدخلٌ خبيث، والمتوقَّع أن يرفضه التطبيق أو يطهّره. نختبر الدفاع كما نختبر أيّ سلوك:
# دالة تهرب من حقن 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))
الاختبار الأمنيّ يتأكّد أن الدفاع يعمل: الاسم العاديّ يمرّ، ومحاولات الحقن تُرفَض. لو مرّت محاولة حقنٍ، فذلك عيبٌ أمنيّ حرج.
٣أنواع اختبار الأمان
| النوع | يفعل |
|---|---|
الفحص الآليّ SAST/DAST | أدوات تمسح الكود أو التطبيق الحيّ بحثًا عن ثغرات |
| اختبار الاختراق Pentest | خبيرٌ يهاجم النظام بإذنٍ ليكشف نقاط الضعف |
| مراجعة الكود الأمنية | قراءة الكود بحثًا عن أنماطٍ خطرة |
توقّع وتحقّق
اختبار الأمان جزء من:
فاحص ثغرات مفتوح المصدر:
اختبار الأمان يحوّل كل ثغرةٍ إلى:
اختبار موقعٍ لا تملكه دون إذن:
الخلاصة
- اختبار الأمان جزءٌ من الجودة: نكشف الثغرات قبل المهاجم.
- نحوّل كل ثغرةٍ إلى حالة اختبار: مدخلٌ خبيث، والمتوقَّع رفضه أو تطهيره.
OWASP ZAPوBurpيفحصان آليًّا؛ ويُكمّلهما الاختبار اليدويّ ومراجعة الكود.- اختبر ما تملكه أو تُؤذَن فيه فقط، ودمج الفحص في كل إصدار.
تحدٍّ برمجي: اختبر الدفاع
متقدمالدالة reject_xss ترفض المدخل إن احتوى <script. اختبرها: الاسم العاديّ يُقبَل، والمدخل الخبيث يُرفَض. اطبع عدد الحالات الناجحة.
- مرّ على الحالات: عاديّ مقبول، وخبيث مرفوض.
- اطبع عدد الحالات الناجحة.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
def reject_xss(text): return "<script" not in text.lower() # True = مقبولcases = [("مرحبا", True), ("<script>بث</script>", False), ("عادي", True)]# اطبع عدد الحالات الناجحة
💡 تلميح 1
sum(1 for t, exp in cases if reject_xss(t) == exp).💡 تلميح 2
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
def reject_xss(text): return "<script" not in text.lower()cases = [("مرحبا", True), ("<script>بث</script>", False), ("عادي", True)]passed = sum(1 for t, exp in cases if reject_xss(t) == exp)print(passed)