اختبار الأمان والخطوات التالية
قوائم فحص الأمان
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 مطلوبة | عالية |
| المصادقة | إدارة الأسرار | عالية |
| الوكيل | أذونات الحد الأدنى | عالية |
| الوكيل | عزل الأدوات | عالية |
| الوكيل | موافقة بشرية للإجراءات | متوسطة |
النقطة الرئيسية: استخدم قوائم الفحص قبل كل نشر. أتمت الفحوصات حيث أمكن، لكن راجع العناصر الحرجة يدوياً دائماً. :::