Fail Closed
الفشل الآمن مقابل الفشل المفتوح Fail Closed
الفشل الآمن (Fail Closed) مبدأ يقضي بأن أي فحص أمني (مصادقة، صلاحيات، تشفير) يرفض الطلب افتراضيًّا عند حدوث خطأ غير متوقّع أثناء الفحص نفسه، بدل افتراض النجاح (Fail Open) والسماح بالمرور.
كل فحص أمني له مسار نجاح (مسموح/مرفوض) لكنه أيضًا قد يفشل بطريقة لم يتوقّعها المطوّر: خدمة الصلاحيات لا تستجيب، اتصال قاعدة البيانات ينقطع أثناء التحقّق، استثناء غير متوقّع يقاطع منطق الفحص. السؤال الحاسم: ماذا يحدث حينها؟
**فشل مفتوح (Fail Open):** الكود يتجاهل الاستثناء (بقصد أو سهوًا) ويكمل التنفيذ كأن الفحص نجح — تحقّق أمني كامل يتحوّل عمليًّا لعدم فعل شيء. **فشل آمن (Fail Closed):** أي استثناء أثناء الفحص يُعامَل كرفض صريح — "لم أستطع التحقّق" يُعامَل تمامًا مثل "غير مسموح"، أبدًا مثل "مسموح".
الصياغة
try { if (!hasPermission()) return forbidden(); } catch { /* فارغ = fail open خطر */ }📄 مثال
// ✅ آمن: أي استثناء أثناء الفحص = رفض صريح (fail closed)
try {
if (!userHasPermission(user, resource)) return forbidden();
} catch (err) {
logger.error(err);
return forbidden(); // الفشل بحد ذاته سبب كافٍ للرفض
}
proceedWithAction();أهم النقاط
| النقطة | الوظيفة |
|---|---|
| Fail Open | استثناء غير معالَج أثناء فحص أمني يُفسَّر ضمنيًّا كسماح — خطر |
| Fail Closed | أي استثناء أثناء الفحص = رفض صريح، بغضّ النظر عن السبب |
| أين يُطبَّق | المصادقة، الصلاحيات، التشفير، أي بوابة قرار أمني |
💡 نصائح عملية
- لا تعتمد على كتلة catch فارغة أبدًا في مسار أمني — استثناء صامت يعني غالبًا فشلًا مفتوحًا دون قصد
⚠️ أخطاء شائعة
- افتراض أن كتلة try/catch حول فحص الصلاحية 'تحمي' الكود تلقائيًّا — دون رفض صريح داخل catch هي في الحقيقة تفتح الباب
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CYBERSECURITY الكامل بالعربي.