يتيح تطبيق للملاحظات للمستخدمة “أليس” (Alice) حفظ “مسودة الميزانية الربع سنوية” كملاحظة تحمل الرقم 1. يقوم المستخدم “بوب” (Bob) بتسجيل الدخول إلى حسابه الخاص، ويطلب GET /notes/1؛ فيتلقى ملاحظة “أليس” لأن الخادم يتحقق فقط من أن “بوب” قد سجل دخوله، دون التحقق مما إذا كان “بوب” هو مالك الملاحظة رقم 1. لم يحتج “بوب” إلى كلمة مرور “أليس” أو صلاحيات وصول خاصة، بل اكتفى بمعرفة مُعرِّف (identifier) يمكن توقعه. إذا طلب “بوب” الملاحظة رقم 1، فهل ينبغي لواجهة برمجة التطبيقات (API) أن تُعيد محتوى “أليس”؟ يوضح المثال المحلي البسيط أدناه الطلب والاستجابة غير الآمنين:
يعيد هذا الكود سجل JSON الخاص بـ “أليس” (Alice) بينما يحدد “بوب” (Bob) على أنه المستخدم القائم بالعملية. يتمثل الخلل الملحوظ في تعطل التحكم في الوصول (broken access control)، حيث يسمح الخادم لمستخدم مصادق عليه بتنفيذ إجراء يتجاوز نطاق صلاحياته. وتتمثل آلية الوقاية الفورية في إجراء فحص للملكية من جانب الخادم قبل قراءة الملاحظة، بينما تظهر إشارة الكشف في سجل الأحداث الذي يوثق بيانات “بوب”، ورقم الملاحظة 1، وقرار رفض التفويض. سنواصل إصلاح تطبيق الملاحظات هذا، بحيث تظل كل قاعدة أمنية مرتبطة بطلب محدد، وجزء من الكود البرمجي، وطريقة للتحقق من الإصلاح.
تكمن أهمية فحص الملكية المفقود في أن المتصفح يقع خارج نطاق الثقة (trust boundary) الخاص بخادم واجهة برمجة التطبيقات (API). يُعرَّف نطاق الثقة بأنه النقطة التي يتلقى فيها التطبيق بيانات أو تعليمات يمكن لطرف آخر التأثير عليها؛ لذا يتعين على الخادم التحقق من صحتها وتطبيق قواعده الخاصة. تنتقل ملف تعريف الارتباط (cookie) الخاص بـ “بوب” ومعرف الملاحظة المطلوبة من عميل غير موثوق به إلى الخادم، ثم ترسل واجهة برمجة التطبيقات استعلاماً إلى قاعدة البيانات فقط بعد اتخاذ قرار التفويض.
يحتوي التطبيق نفسه على أكثر من نقطة دخول؛ إذ يمكن لمستخدم إنترنت غير مصادق عليه إرسال بيانات تسجيل الدخول أو إنشاء ملاحظة، كما يمكن لمستخدم ذي صلاحيات محدودة -مثل “بوب”- تزويد النظام بمعرفات الملاحظات ونصوصها بعد تسجيل الدخول. وقد تتسرب تبعية برمجية (dependency) مخترقة أثناء عملية البناء (build) عندما يزود سجل الحزم (package registry) النظام بكود سيقوم الخادم بتشغيله لاحقاً. وتشمل الأصول التي تستحق الحماية: الجلسات النشطة، وملاحظات “أليس”، وأسرار الخادم، وسجلات الأحداث التي توضح الطلبات التي تم تنفيذها. يتبع المخطط مسار كل مدخل وصولاً إلى المكون البرمجي الذي يجب عليه اتخاذ قرار بشأن الوثوق بتلك المدخلات أم لا: