تطوير البرمجيات الآمن / أساسي: النتائج والنماذج والقرارات / الدرس 5
تصميم افتراضات آمنة وثوابت قابلة للإنفاذ
اختيار سلوك صريح لغياب السياسة وغموض التبعية وانتقالات الحالة.
في هذه الصفحة
أهداف الدرس
- فصل الافتراض الآمن عن وصفة رفض الجميع.
- وضع ثابت العمل عند حد يستطيع إنفاذه باتساق.
توضيح الحالة غير المحددة
يجب ألا تتحول صلاحية غير محددة بصمت إلى إذن. في تصدير الورش، ينبغي أن يمنع غياب معلومات الإسناد كشف بيانات الاتصال، مع إنتاج نتيجة تشغيلية موثقة. لا يعني ذلك توقف كل نظام فرعي بالطريقة نفسها؛ فقد تفرض السلامة والتكامل والسرية والتوفر متطلبات مختلفة. قرر سلوك كل إجراء محمي وسجل المفاضلة. فالتنفيذ الذي يفسر غياب كائن السياسة بأنه سماح يتخذ قرار تصميم مؤثرا، سواء قصد أحد ذلك أم لا. تستحق السلوكيات الافتراضية مراجعة مقصودة.
تمثيل المجهول منفصلا عن الرفض
قد تبلغ التبعية أن المنظم مسند أو غير مسند أو يتعذر تحديد إسناده. قد يمنع الإفصاح المحمي في الحالتين الأخيرتين، لكن ينبغي أن يميز التشخيص والتعافي بينهما. ينمذج البرنامج الحالات الثلاث؛ فلا يحول معالج استثناء واسع كل خطأ إلى سماح، ولا يساوي المجهول برفض سياسة دائم. يحتوي النموذج حقائق معلنة فقط، ولا يستعلم خدمة إسناد أو يثبت توفرها أو يحدد خريطة حالات HTTP العامة. تعتمد تلك القرارات على العقد المعتمد.
def export_decision(assignment_state):
if assignment_state == "assigned":
return {"allow": True, "reason": "policy-satisfied"}
if assignment_state == "not-assigned":
return {"allow": False, "reason": "policy-denial"}
return {"allow": False, "reason": "policy-unavailable"}
assert export_decision("assigned")["allow"] is True
assert export_decision("not-assigned")["reason"] == "policy-denial"
assert export_decision("unknown")["reason"] == "policy-unavailable"
print("three policy states distinguished")
three policy states distinguished
يفحص البرنامج الكامل فئات قرار السياسة الخيالية. يمنع البديل الإفصاح المنمذج وليس توصية عامة لكل فشل. لا يفحص الهوية أو التبعية أو الاستجابة الفعلية.
وضع الثابت عند تغير الحالة
قد ينص ثابت التسجيل على ألا يزيد الإلغاء عدد الحضور النشط، وألا ينشئ إلغاء تسجيل ملغى إشعارا ثانيا. ينبغي أن يفرض حد الانتقال القاعدة حتى إذا استخدم عميل مشروع آخر غير الواجهة المرئية. يجعل البرنامج الإلغاء انتقال حالة صريحا ويفحص تطبيقه المتكرر. إنه نموذج محلي متسلسل بلا مخزن أحداث دائم أو معاملة ذرية. في التنفيذ الفعلي، يجب تنسيق تغير السجل والحدث المهم للعقد حسب تصميم التخزين المختار، لتجنب الآثار الجزئية أو المكررة.
def cancel(state):
if state["status"] == "cancelled":
return dict(state), 0
return {**state, "status": "cancelled"}, 1
first, notices = cancel({"id":"registration-1", "status":"active"})
second, repeated_notices = cancel(first)
assert first == second
assert (notices, repeated_notices) == (1, 0)
print("cancellation invariant checked sequentially")
cancellation invariant checked sequentially
يعيد البرنامج الكامل عدد آثار بدلا من إرسال إشعار. يفحص السياسة المتسلسلة فقط ولا يثبت إزالة التكرار بين العمليات أو التسليم المعاملي أو صحة كل حالات التسجيل.
تقليل السلطة قبل إضافة المرشحات
عندما يحتاج مكون عناوين الورش العامة فقط، فلا تمنحه واجهة غير مقيدة لتصدير بيانات الاتصال مع الاعتماد على تذكر المستدعي علما معينا. فضل عملية ضيقة أو إسقاط استجابة تتناسب سلطته مع المهمة. يقلل ذلك عدد المواضع التي يجب أن تحجب الحقول الخاصة بصورة صحيحة. ما زالت الواجهات الضيقة تحتاج التحقق والصلاحية، ولا تلغي كل المخاطر. راجع تفاعل الافتراضات والمعاملات الاختيارية والاستثناءات الإدارية. قد تهزم واجهة تسهيل توسع النطاق بصمت عند غياب معامل تصميم صلاحية دقيقا.
اختبار الافتراض والتعافي
أدرج غياب الإعداد والقيم غير المعروفة في التعداد ورفض التبعية والحالة المعطوبة والتعافي المشروع في مراجعة التصميم. يجب أن توضح كل حالة النتيجة المحمية وما يستطيع المستدعي فعله تاليا. لا تستخدم التقاطا عاما مع التجاهل يخفي فساد الحالة أو تكرار المعالجة. احفظ الفروق التشخيصية المفيدة دون كشف التفاصيل الداخلية في الرد العام. يقوى الافتراض الآمن عندما يكون صريحا وقابلا للرصد ومتحققا عند حد الإنفاذ الفعلي، مع مراجعة مفاضلات التوفر من مسؤولي المنتج والهندسة.
الأخطاء الشائعة وإصلاحها
يسمح غياب السياسة بالتصدير بصمت
- لماذا يحدث؟
- يمنح البديل الضمني سلطة.
- كيف تصلحه؟
- نفذ نتيجة منع الإفصاح الموثقة.
- كيف تتجنب تكراره؟
- اختبر الغياب والمجهول صراحة.
يوصف المجهول بأنه رفض دائم
- لماذا يحدث؟
- يختزل غموض التبعية إلى السياسة.
- كيف تصلحه؟
- افصل الفئات الداخلية وإرشاد التعافي.
- كيف تتجنب تكراره؟
- نمذج أكثر من قيمة إذن منطقية.
تمنع الواجهة التكرار ولا يمنعه الخلفي
- لماذا يحدث؟
- يوجد الثابت في العميل المرئي فقط.
- كيف تصلحه؟
- أنفذ الانتقال عند الحد المشترك الموثوق.
- كيف تتجنب تكراره؟
- راجع كل مدخل مشروع للتعديل.
اختبر فهمك
1. هل ينبغي أن تنتج حالتا تعذر السياسة وعدم الإسناد السجل الداخلي نفسه؟
اعرض الحل المشروح
لا. قد تمنع الحالتان كشف بيانات الاتصال، لكنهما تختلفان في السبب ومسار التعافي. احفظ فئة تشخيص غير سرية لتعذر التبعية، واجعل الرد العام متسقا مع سياسة الإفصاح المعتمدة. اختبر الفرق دون كشف تفاصيل البنية التحتية.
2. يحافظ الإلغاء المتكرر على الحالة نفسها لكنه يرسل إشعارا آخر. ما الذي فشل؟
اعرض الحل المشروح
تحقق ثابت الحالة وفشل ثابت الأثر الجانبي. أدرج أثر الإشعار في عقد الانتقال، ونسقه مع تغير الحالة حسب التصميم المراجع. يوضح النموذج المحلي المتسلسل السياسة، بينما يحتاج الإنفاذ الدائم والمتزامن إلى دليل مستقل.
أهم ما تعلمته
- الافتراضات قرارات أمن ولو كانت ضمنية.
- قد يحمي المجهول والرفض مع حاجتهما تشخيصا مختلفا.
- توضع الثوابت عند حدود انتقال موثوقة.