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

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

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

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

أنواع فحص ZAP

نوع الفحص المدة التغطية حالة الاستخدام
أساسي 1-5 دقائق منخفضة فحوصات PR، التحقق السريع
كامل 30-120 دقيقة عالية فحوصات ليلية، ما قبل الإصدار
API 5-30 دقيقة API فقط اختبار REST/GraphQL
Ajax Spider 15-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: الاختبار الديناميكي وأمان وقت التشغيل

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

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

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

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