طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 243 · أمن الويب
تقييم الدرس 28

مشروع: تدقيق تطبيق وإصلاح ثغراته

أجب عن الأسئلة ثم اضغط «صحّح ورقتي» في آخر الصفحة. ← العودة إلى الدرس

أسئلة التقييم

تقييم الدرس 28: مشروع: تدقيق تطبيق وإصلاح ثغراته. إجاباتك تُحفظ تلقائيًّا على هذا الجهاز؛ أجب ثم اضغط «صحّح ورقتي».

1السؤال الأول: اختر الإجابة الصحيحة

1) منهجية التدقيق تبدأ بـ:
2) أي ثغرة في مسار /search هنا؟
const express = require('express');const app = express();app.use(express.json());app.use(express.urlencoded({ extended: false })); const sqlite3 = require('sqlite3');const db = new sqlite3.Database(':memory:');db.serialize(() => {  db.run(`CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, pass TEXT, role TEXT, email TEXT)`);  db.run(`INSERT INTO users (name, pass, role, email) VALUES    ('سارة', 's@rah123', 'customer', 'sara@mail.sa'),    ('خالد', 'kh@led456', 'customer', 'khaled@mail.sa'),    ('المدير', 'Adm!n#2025', 'admin', 'admin@mail.sa')`);  db.run(`CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER)`);  db.run(`INSERT INTO products (name, price) VALUES    ('سماعة', 120), ('لوحة مفاتيح', 90), ('كاميرا ويب', 210)`);}); const SESSIONS = { 'tok-sara': 1, 'tok-khaled': 2 };function auth(req, res, next) {  const id = SESSIONS[(req.headers.authorization || '').replace('Bearer ', '')];  if (!id) return res.status(401).json({ error: 'سجّل الدخول' });  req.userId = id; next();} // ثغرة 1: حقن SQL في البحثapp.get('/search', (req, res) => {  db.all("SELECT id, name, price FROM products WHERE name LIKE '%" + req.query.q + "%'",    (e, rows) => e ? res.status(500).json({ error: String(e.message) }) : res.json(rows));}); // ثغرة 2: IDOR — أي مستخدم يرى ملاحظات غيرهconst notes = [{ id: 1, userId: 1, text: 'ملاحظة سارة' }, { id: 2, userId: 2, text: 'ملاحظة خالد' }];app.get('/notes/:id', auth, (req, res) => {  const n = notes.find(x => x.id === Number(req.params.id));  if (!n) return res.status(404).json({ error: 'غير موجود' });  res.json(n);}); // ثغرة 3: XSS — يعرض التعليق مدموجًا في HTMLlet comments = [];app.post('/comment', (req, res) => { comments.push(req.body.text || ''); res.status(201).json({ ok: true }); });app.get('/comments', (req, res) => {  res.type('html').send('<ul>' + comments.map(c => '<li>' + c + '</li>').join('') + '</ul>');}); app.listen(3000);
3) إصلاح IDOR في /notes/:id:
4) إصلاح XSS في /comments:
5) بعد إصلاح الثغرات يجب:

2السؤال الثاني: صح أم خطأ

1) إصلاح ثغرة دون التحقق منها قد يترك الهجوم ممكنًا.
الصواب: صح
2) إصلاح ثغرة واحدة من ثلاث يكفي لتأمين التطبيق.
الصواب: خطأ
3) حقن SQL و XSS كلاهما في فئة الحقن (A03).
الصواب: صح
4) IDOR من فئة تعطّل التحكم بالوصول (A01).
الصواب: صح
5) التدقيق يُمرّر المسارات على قائمة OWASP.
الصواب: صح

3السؤال الثالث: أكمل الفراغات من القائمة المنسدلة

1) إصلاح حقن SQL يكون بالاستعلام .
الإجابة: المعلَّم
2) إصلاح IDOR بشرط والرد 404.
الإجابة: الملكية
3) إصلاح XSS بترميز .
الإجابة: المخرجات

4السؤال الرابع: أسئلة عملية

1) لكل ثغرة يُختبر: هجوم يُرفض، واستخدام عادي ينجح.
الصواب: صح
2) ثغرة واحدة متبقية في التطبيق تكفي لاختراقه.
الصواب: صح
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».

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