طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 241 · تحليل وتصميم برمجيات الويب
تقييم الدرس 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":"غير موجود"}
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس