تقييم الدرس 18
طبقات حماية إضافية واختبار الصلاحيات
أجب عن الأسئلة ثم اضغط «صحّح ورقتي» في آخر الصفحة. ← العودة إلى الدرس
أسئلة التقييم
تقييم الدرس 18: طبقات حماية إضافية واختبار الصلاحيات. إجاباتك تُحفظ تلقائيًّا على هذا الجهاز؛ أجب ثم اضغط «صحّح ورقتي».
1السؤال الأول: اختر الإجابة الصحيحة
1) أي طبقة تمنع متدربًا من إرسال الحالة «
paid» إلى الخادم؟2) الكود
{ ...req.body } عند إنشاء سجل يسبب غالبًا:3) أي حالة اختبار تكشف
IDOR؟4) أقوى طريقة للتحقق من قيمة الحالة:
5) من أين تأتي حالات اختبار الصلاحيات؟
2السؤال الثاني: صح أم خطأ
1) التحقق من تسجيل الدخول يكفي لمنع
IDOR.الصواب: خطأ
2) هوية المستخدم تؤخذ من الرمز لا من جسم الطلب.
الصواب: صح
3) الحالات السالبة في الاختبار أقل أهمية من الموجبة.
الصواب: خطأ
4) الدفاع بالعمق يعني طبقات حماية متعددة متتالية.
الصواب: صح
5) الرد 404 على سجل لا يملكه المستخدم يخفي وجوده.
الصواب: صح
3السؤال الثالث: أكمل الفراغات من القائمة المنسدلة
1) الثغرة التي يصل فيها مستخدم لسجل غيره بتغيير رقمه تسمّى .
الإجابة: IDOR
2) قيمة غير مسموحة في جسم الطلب يُرد عليها بالرمز .
الإجابة: 400
3) مبدأ الطبقات المتعددة للحماية يسمّى .
الإجابة: الدفاع بالعمق
4السؤال الرابع: أسئلة عملية
1) ماذا يعيد الخادم المصحّح لسارة عند طلبها السجل 2؟ GET /api/enrollments/2
const express = require('express');const app = express();app.use(express.json()); // من مصفوفة الصلاحيات (الدرس 16) إلى الكود مباشرةconst ROLE_PERMS = { trainee: ['course:read', 'enrollment:create', 'enrollment:read:own'], trainer: ['course:read', 'attendance:record'], registrar: ['course:read', 'enrollment:read', 'enrollment:approve'], manager: ['course:read', 'enrollment:read', 'report:finance', 'user:manage'],};const users = [ { id: 1, name: 'سارة', role: 'trainee' }, { id: 2, name: 'نورة', role: 'registrar' }, { id: 3, name: 'أ. فهد', role: 'manager' }, { id: 4, name: 'خالد', role: 'trainer' },];// رموز دخول مبسطة للتجربة؛ في النظام الحقيقي JWT كما في مقرر أطر الويبconst tokens = { 'tok-sara': 1, 'tok-noura': 2, 'tok-fahad': 3, 'tok-khaled': 4 }; // 1) المصادقة: من أنت؟function authenticate(req, res, next) { const t = (req.headers.authorization || '').replace('Bearer ', ''); const user = users.find(u => u.id === tokens[t]); if (!user) return res.status(401).json({ error: 'سجّل الدخول أولًا' }); req.user = user; next();} // 2) التفويض: هل يحق لك؟const can = (user, perm) => (ROLE_PERMS[user.role] || []).includes(perm);function authorize(perm) { return (req, res, next) => can(req.user, perm) ? next() : res.status(403).json({ error: 'لا تملك الصلاحية ' + perm });} const enrollments = [ { id: 1, traineeId: 1, course: 'تصميم الويب', status: 'pending' }, { id: 2, traineeId: 5, course: 'قواعد البيانات', status: 'pending' },]; app.get('/api/enrollments/:id', authenticate, (req, res) => { const e = enrollments.find(x => x.id === Number(req.params.id)); const mine = e && e.traineeId === req.user.id; if (!e || !(mine || can(req.user, 'enrollment:read'))) return res.status(404).json({ error: 'غير موجود' }); // لا نكشف حتى وجوده res.json(e);}); app.listen(3000);
الاستجابة الصحيحة:
{"error":"غير موجود"}أجب عن الأسئلة ثم اضغط «صحّح ورقتي».