اختبار الأمان والخطوات التالية

قوائم فحص الأمان

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

قوائم الفحص تضمن عدم تفويت أي شيء في عجلة النشر. يوفر هذا الدرس قوائم فحص أمان شاملة لمرحلة التطوير والتحقق قبل النشر.

قائمة فحص مرحلة التطوير

┌─────────────────────────────────────────────────────────────┐
│                 قائمة فحص أمان التطوير                      │
│                                                             │
│ ☐ التحقق من المدخلات                                        │
│   ☐ حدود الطول مُطبقة                                       │
│   ☐ كشف الأنماط لمحاولات الحقن                              │
│   ☐ تصنيف المحتوى مُفعل                                     │
│   ☐ تحديد المعدل مُنفذ                                      │
│                                                             │
│ ☐ معالجة المخرجات                                          │
│   ☐ تطهير HTML/XSS                                         │
│   ☐ كشف وتنقيح PII                                         │
│   ☐ إشراف المحتوى نشط                                       │
│   ☐ حدود طول الاستجابة                                     │
│                                                             │
│ ☐ حماية محث النظام                                         │
│   ☐ لا بيانات حساسة في المحثات                             │
│   ☐ كشف التسريب مُنفذ                                       │
│   ☐ حدود المحث محددة بوضوح                                 │
└─────────────────────────────────────────────────────────────┘

التحقق الآلي من قائمة الفحص

from dataclasses import dataclass
from typing import List, Optional, Callable
from enum import Enum

class CheckStatus(Enum):
    PASS = "pass"
    FAIL = "fail"
    WARN = "warn"
    SKIP = "skip"

@dataclass
class CheckItem:
    id: str
    name: str
    description: str
    category: str
    check_function: Optional[Callable[[], bool]] = None
    severity: str = "high"  # high, medium, low

@dataclass
class CheckResult:
    item: CheckItem
    status: CheckStatus
    message: str

class SecurityChecklist:
    """التحقق الآلي من قائمة فحص الأمان."""

    def __init__(self):
        self.items: List[CheckItem] = []
        self.results: List[CheckResult] = []

    def add_item(self, item: CheckItem):
        """إضافة عنصر فحص للقائمة."""
        self.items.append(item)

    def run_all_checks(self) -> List[CheckResult]:
        """تشغيل جميع فحوصات الأمان."""
        self.results = []

        for item in self.items:
            result = self._run_check(item)
            self.results.append(result)

        return self.results

    def _run_check(self, item: CheckItem) -> CheckResult:
        """تشغيل فحص واحد."""
        if item.check_function is None:
            return CheckResult(
                item=item,
                status=CheckStatus.SKIP,
                message="لا يوجد فحص آلي متاح"
            )

        try:
            passed = item.check_function()
            return CheckResult(
                item=item,
                status=CheckStatus.PASS if passed else CheckStatus.FAIL,
                message="نجح الفحص" if passed else "فشل الفحص"
            )
        except Exception as e:
            return CheckResult(
                item=item,
                status=CheckStatus.FAIL,
                message=f"خطأ أثناء الفحص: {str(e)}"
            )

    def get_summary(self) -> dict:
        """الحصول على ملخص نتائج الفحص."""
        return {
            "total": len(self.results),
            "passed": sum(1 for r in self.results if r.status == CheckStatus.PASS),
            "failed": sum(1 for r in self.results if r.status == CheckStatus.FAIL),
            "warnings": sum(1 for r in self.results if r.status == CheckStatus.WARN),
            "skipped": sum(1 for r in self.results if r.status == CheckStatus.SKIP),
        }

    def generate_report(self) -> str:
        """توليد تقرير markdown."""
        lines = ["# تقرير قائمة فحص الأمان\n"]

        # تجميع حسب الفئة
        by_category = {}
        for result in self.results:
            cat = result.item.category
            if cat not in by_category:
                by_category[cat] = []
            by_category[cat].append(result)

        for category, results in by_category.items():
            lines.append(f"\n## {category}\n")
            for result in results:
                icon = {
                    CheckStatus.PASS: "✅",
                    CheckStatus.FAIL: "❌",
                    CheckStatus.WARN: "⚠️",
                    CheckStatus.SKIP: "⏭️",
                }[result.status]

                lines.append(f"- {icon} **{result.item.name}**")
                lines.append(f"  - {result.message}")

        # الملخص
        summary = self.get_summary()
        lines.append(f"\n## الملخص\n")
        lines.append(f"- الإجمالي: {summary['total']}")
        lines.append(f"- ناجح: {summary['passed']}")
        lines.append(f"- فاشل: {summary['failed']}")
        lines.append(f"- تحذيرات: {summary['warnings']}")

        return "\n".join(lines)

قائمة فحص ما قبل النشر

def create_pre_deployment_checklist(config: dict) -> SecurityChecklist:
    """إنشاء قائمة فحص أمان ما قبل النشر."""
    checklist = SecurityChecklist()

    # فحوصات التحقق من المدخلات
    checklist.add_item(CheckItem(
        id="input-001",
        name="حدود طول المدخلات",
        description="الحد الأقصى لطول المدخلات مُطبق",
        category="التحقق من المدخلات",
        check_function=lambda: config.get("max_input_length", 0) > 0,
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="input-002",
        name="كشف أنماط الحقن",
        description="أنماط كشف محاولات الحقن مكونة",
        category="التحقق من المدخلات",
        check_function=lambda: len(config.get("injection_patterns", [])) > 0,
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="input-003",
        name="تحديد المعدل",
        description="تحديد المعدل مُفعل ومكون",
        category="التحقق من المدخلات",
        check_function=lambda: config.get("rate_limit_enabled", False),
        severity="high"
    ))

    # فحوصات أمان المخرجات
    checklist.add_item(CheckItem(
        id="output-001",
        name="تطهير XSS",
        description="المخرجات مطهرة لسياقات HTML",
        category="أمان المخرجات",
        check_function=lambda: config.get("sanitize_html", False),
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="output-002",
        name="تنقيح PII",
        description="أنماط PII تُكتشف وتُنقح",
        category="أمان المخرجات",
        check_function=lambda: config.get("pii_redaction", False),
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="output-003",
        name="إشراف المحتوى",
        description="إشراف المحتوى نشط",
        category="أمان المخرجات",
        check_function=lambda: config.get("content_moderation", False),
        severity="medium"
    ))

    # فحوصات الحواجز
    checklist.add_item(CheckItem(
        id="guard-001",
        name="NeMo Guardrails مكون",
        description="ملفات تكوين الحواجز موجودة وصالحة",
        category="الحواجز",
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="guard-002",
        name="مصنف السلامة مُفعل",
        description="LLaMA Guard أو مصنف مشابه نشط",
        category="الحواجز",
        check_function=lambda: config.get("safety_classifier", False),
        severity="high"
    ))

    # فحوصات المراقبة
    checklist.add_item(CheckItem(
        id="monitor-001",
        name="التسجيل مُفعل",
        description="أحداث الأمان يتم تسجيلها",
        category="المراقبة",
        check_function=lambda: config.get("logging_enabled", False),
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="monitor-002",
        name="التنبيهات مكونة",
        description="التنبيهات مكونة لأحداث الأمان",
        category="المراقبة",
        check_function=lambda: config.get("alerting_enabled", False),
        severity="medium"
    ))

    # فحوصات المصادقة
    checklist.add_item(CheckItem(
        id="auth-001",
        name="مصادقة API",
        description="نقاط نهاية API تتطلب مصادقة",
        category="المصادقة",
        check_function=lambda: config.get("require_auth", False),
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="auth-002",
        name="مفاتيح API مؤمنة",
        description="مفاتيح API مخزنة بأمان (ليست في الكود)",
        category="المصادقة",
        severity="high"
    ))

    return checklist

# الاستخدام
app_config = {
    "max_input_length": 4000,
    "injection_patterns": ["ignore.*instructions", "you are now"],
    "rate_limit_enabled": True,
    "sanitize_html": True,
    "pii_redaction": True,
    "content_moderation": True,
    "safety_classifier": True,
    "logging_enabled": True,
    "alerting_enabled": True,
    "require_auth": True,
}

checklist = create_pre_deployment_checklist(app_config)
results = checklist.run_all_checks()
report = checklist.generate_report()
print(report)

قائمة فحص مرجعية سريعة

الفئةالفحصالأولوية
المدخلاتحدود الطول مُطبقةعالية
المدخلاتأنماط الحقن محظورةعالية
المدخلاتتحديد المعدل نشطعالية
المخرجاتتطهير HTMLعالية
المخرجاتتنقيح PII مُفعلعالية
المخرجاتإشراف المحتوىمتوسطة
الحواجزNeMo/LLaMA Guard نشطعالية
الحواجزقواعد الموضوع مكونةمتوسطة
المراقبةتسجيل الأمانعالية
المراقبةالتنبيهات مكونةمتوسطة
المصادقةمصادقة API مطلوبةعالية
المصادقةإدارة الأسرارعالية
الوكيلأذونات الحد الأدنىعالية
الوكيلعزل الأدواتعالية
الوكيلموافقة بشرية للإجراءاتمتوسطة

النقطة الرئيسية: استخدم قوائم الفحص قبل كل نشر. أتمت الفحوصات حيث أمكن، لكن راجع العناصر الحرجة يدوياً دائماً. :::

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

اختبار

الوحدة 6: اختبار الأمان والخطوات التالية

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

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

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

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