صفحة ترحيب بسيطة تكتب اسمك فترسل الصفحة طلبا إلى الخادم والخادم يرد بتحية الصفحة ترسل دائما أنك زائر ولا يوجد في الواجهة ما يغير ذلك
صفحة ترحيب تعريفية في الغربان مهمتها أن تعلمك أداة الطلبات في أسفل اللاب تكتب اسمك فترسل الصفحة طلبا فيه role=guest دائما والخادم يصدق ما يصله لا شيء في الصفحة يغير دورك لكن أداة الطلبات تتيح لك تعديل الطلب قبل إعادة إرساله
يصل إلى الخادم طلب فيه role=admin.
لماذا نجح الحل
الخادم صدق قيمة role التي وصلته في الطلب لكن الطلب يكتبه العميل ومن يملك أداة تعرض الطلبات يستطيع أن يكتب فيه ما يشاء إخفاء الخيار من الواجهة لا يمنع إرساله
السبب الجذري
الخادم يقرأ الدور من الطلب نفسه والطلب يكتبه العميل ويمكن تعديله الجذر الثقة في مدخل العميل لاتخاذ قرار صلاحية
كيف يصلح الكود
القاعدة: كل ما يصل في الطلب مدخل غير موثوق الصلاحيات تقرأ من جلسة يحفظها الخادم لا من قيمة يرسلها العميل
الكود المصاب
app.get('/hello', (req, res) => {
// The role comes straight from the request: the client decides who it is.
const role = req.query.role;
res.send(greeting(req.query.name, role));
});
الكود الآمن
app.get('/hello', (req, res) => {
// The role comes from the server-side session, set at login. The request cannot change it.
const role = req.session.user?.role ?? 'guest';
res.send(greeting(req.query.name, role));
});
الأثر في الواقع
الثقة في قيم يرسلها العميل للصلاحيات تسمح بترقية الدور والوصول لوظائف المدراء وهي أساس كثير من ثغرات التحكم في الوصول
كيف يكتشفها المدافعون
المدافع يقرأ الصلاحيات من جلسة الخادم لا من الطلب ويرصد طلبات تحمل أدوارا مرتفعة من حسابات عادية