موقع أعضاء الغربان يعطي كل عضو سجلا فيه رمز المخبأ الخاص به ويعرض السجل حسب رقمه في الرابط الصقر دخل بحساب ضيف ورقم سجله 1050 والأرقام متسلسلة وسجل الزعيم من الأوائل ولا يوجد أي فحص لمن يملك السجل
دليل أعضاء الغربان تطبيق يعرض سجل عضو حسب الرقم في مسار العنوان members/الرقم أنت داخل كـ guest ورقمك 1050 والرقم ظاهر في شريط العنوان فتقدر تغيره بنفسك هذا هو التصفح القسري السجلات متسلسلة وسجل الزعيم من أوائلها
لماذا نجح الحل
هذا IDOR مرجع مباشر غير آمن لكائن الموقع يعرض السجل حسب الرقم ولا يتحقق أن الحساب الحالي يملك هذا السجل فأي عضو يقرأ سجلات الجميع بمجرد تغيير الرقم الحل: تحقق من الصلاحية في الخادم على كل طلب كائن اسأل هل المستخدم الحالي يملك هذا السجل أو مسموح له به قبل إرجاعه إخفاء الرقم لا يكفي الفحص هو الحل
السبب الجذري
الخادم يرجع السجل المطابق للرقم بلا أي فحص أن المستخدم الحالي يملكه غياب التحقق من الملكية على مستوى الكائن هو جوهر IDOR
كيف يصلح الكود
القاعدة: افحص الملكية على مستوى الكائن لكل طلب لا تثق أبدا بمعرف كائن يرسله المستخدم بدون فحص من يملكه
الكود المصاب
app.get('/record', (req, res) => {
if (!req.session.user) return res.status(401).end();
// No ownership check: any logged-in user reads any record.
res.json(db.record(req.query.id));
});
الكود الآمن
app.get('/record', (req, res) => {
if (!req.session.user) return res.status(401).end();
const record = db.record(req.query.id);
// Authorize the object: does this user own it (or have rights to it)?
if (!record || record.ownerId !== req.session.user) return res.status(403).end();
res.json(record);
});
الأثر في الواقع
IDOR من أكثر الثغرات ربحا في برامج المكافآت وقد سرب سجلات طبية وفواتير وبيانات حسابات ملايين المستخدمين بمجرد تغيير رقم في الرابط
كيف يكتشفها المدافعون
المدافع يرصد وصول مستخدم لمعرفات كثيرة ليست له في وقت قصير ويفرض تحققا من الملكية في طبقة البيانات لا في الواجهة فقط