الاختبار الديناميكي وأمان وقت التشغيل

أتمتة OWASP ZAP في خطوط الأنابيب

3 دقيقة للقراءة

OWASP ZAP (Zed Attack Proxy) هو أداة DAST المجانية الأكثر شعبية في العالم. إليك كيفية دمجها في خط أنابيب CI/CD الخاص بك.

أنواع فحص ZAP

نوع الفحصالمدةالتغطيةحالة الاستخدام
أساسي1-5 دقائقمنخفضةفحوصات PR، التحقق السريع
كامل30-120 دقيقةعاليةفحوصات ليلية، ما قبل الإصدار
API5-30 دقيقةAPI فقطاختبار REST/GraphQL
Ajax Spider15-60 دقيقةSPAsتطبيقات React، Vue، Angular

تكامل GitHub Actions

فحص أساسي (سريع)

# .github/workflows/dast-baseline.yml
name: DAST Baseline Scan

on:
  pull_request:
    branches: [main]

jobs:
  zap-baseline:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to staging
        run: |
          # سكريبت النشر الخاص بك
          echo "Deploying to staging..."

      - name: ZAP Baseline Scan
        uses: zaproxy/action-baseline@v0.10.0
        with:
          target: 'https://staging.example.com'
          rules_file_name: '.zap/rules.tsv'
          cmd_options: '-a'  # تضمين قواعد ألفا

      - name: Upload ZAP Report
        uses: actions/upload-artifact@v4
        with:
          name: zap-report
          path: report_html.html

فحص كامل (شامل)

# .github/workflows/dast-full.yml
name: DAST Full Scan

on:
  schedule:
    - cron: '0 2 * * *'  # 2 صباحاً يومياً

jobs:
  zap-full:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: ZAP Full Scan
        uses: zaproxy/action-full-scan@v0.9.0
        with:
          target: 'https://staging.example.com'
          rules_file_name: '.zap/rules.tsv'
          cmd_options: >
            -j  # استخدام Ajax spider
            -m 5  # مهلة Spider 5 دقائق

      - name: Upload Results to GitHub Security
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: 'zap-results.sarif'

تكوين قواعد ZAP

إنشاء قواعد مخصصة لضبط سلوك الفحص:

# .zap/rules.tsv
# ID	Action	Name
10021	IGNORE	X-Content-Type-Options Header Missing
10038	WARN	Content Security Policy (CSP) Header Not Set
40012	FAIL	Cross Site Scripting (Reflected)
40014	FAIL	Cross Site Scripting (Persistent)
90022	FAIL	Application Error Disclosure

الإجراءات:

  • IGNORE: لا تبلغ (إيجابي خاطئ)
  • WARN: أبلغ لكن لا تفشل خط الأنابيب
  • FAIL: أبلغ وأفشل خط الأنابيب

الفحص المصادق عليه

معظم التطبيقات تتطلب تسجيل الدخول. استخدم خيارات المصادقة في ZAP:

الخيار 1: ملف السياق

# .zap/context.xml
<context>
  <name>MyApp</name>
  <authentication>
    <type>formBasedAuthentication</type>
    <loginUrl>https://app.example.com/login</loginUrl>
    <loginRequestBody>username={%username%}&amp;password={%password%}</loginRequestBody>
  </authentication>
  <users>
    <user>
      <name>test-user</name>
      <credentials>
        <username>testuser</username>
        <password>${ZAP_AUTH_PASSWORD}</password>
      </credentials>
    </user>
  </users>
</context>
# GitHub Actions مع المصادقة
- name: ZAP Full Scan
  uses: zaproxy/action-full-scan@v0.9.0
  with:
    target: 'https://staging.example.com'
    docker_name: 'ghcr.io/zaproxy/zaproxy:stable'
  env:
    ZAP_AUTH_PASSWORD: ${{ secrets.ZAP_AUTH_PASSWORD }}

الخيار 2: رأس التفويض

# لمصادقة API/JWT
- name: ZAP API Scan
  uses: zaproxy/action-api-scan@v0.6.0
  with:
    target: 'https://api.example.com/openapi.json'
    cmd_options: >
      -z "replacer.full_list(0).description=auth"
      -z "replacer.full_list(0).enabled=true"
      -z "replacer.full_list(0).matchtype=REQ_HEADER"
      -z "replacer.full_list(0).matchstr=Authorization"
      -z "replacer.full_list(0).replacement=Bearer ${{ secrets.API_TOKEN }}"

التعامل مع النتائج

الفشل على النتائج الحرجة

- name: Check ZAP Results
  run: |
    if grep -q "FAIL-NEW" zap-results.json; then
      echo "New vulnerabilities found!"
      exit 1
    fi

إنشاء مشاكل GitHub

- name: Create Issue on Failure
  if: failure()
  uses: actions/github-script@v7
  with:
    script: |
      github.rest.issues.create({
        owner: context.repo.owner,
        repo: context.repo.repo,
        title: 'DAST Scan Found Vulnerabilities',
        body: 'Check the ZAP report in the workflow artifacts.',
        labels: ['security', 'dast']
      })

نصائح الأداء

التحسينكيف
تحديد عمق الزحف--spider.maxDepth=5
استثناء الأصول الثابتة`--exclude='.*.(css
استخدام الأساسي لـ PRsأسرع، ثغرات شائعة فقط
تشغيل الفحوصات الكاملة ليلاًساعات خارج الذروة
تخزين صورة ZAP Docker مؤقتاًاستخدام خطوة docker pull

بعد ذلك، سنستكشف اختبار أمان API مع Nuclei. :::

مراجعة سريعة: كيف تجد هذا الدرس؟

اختبار

الوحدة 4: الاختبار الديناميكي وأمان وقت التشغيل

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.