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

حقن SQL في المختبر

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

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

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

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

1) حقن SQL ممكن حين:
2) ماذا يحدث عند إرسال name = x' OR '1'='1 لهذا الخادم؟
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)`);}); // ✗ يبني الاستعلام بدمج المدخل نصًّاapp.post('/login', (req, res) => {  const sql = "SELECT name, role FROM users WHERE name = '"            + req.body.name + "' AND pass = '" + req.body.pass + "'";  db.get(sql, (err, row) => {    if (err) return res.status(500).json({ error: 'خطأ في الاستعلام' });    if (!row) return res.status(401).json({ error: 'بيانات الدخول خاطئة' });    res.json({ welcome: row.name, role: row.role });  });}); app.listen(3000);
3) أضعف دفاع ضد حقن SQL:
4) في الاستعلام المعلَّم، القيمة تُعامَل:
5) لماذا نضيف أقل الصلاحيات مع الاستعلام المعلَّم؟

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

1) المدخل x' OR '1'='1 يستغل دمج النص في الاستعلام.
الصواب: صح
2) منع كلمة OR حل كافٍ وآمن لحقن SQL.
الصواب: خطأ
3) الاستعلام المعلَّم يفصل القيمة عن نص الأمر.
الصواب: صح
4) الاستعلام المعلَّم غالبًا لا يبطئ الأداء، وقد يسرّعه.
الصواب: صح
5) ثغرة حقن واحدة في مسار واحد تكفي لاختراق القاعدة.
الصواب: صح

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

1) لفصل القيمة عن نص الأمر نكتب علامة ونمرّر القيم منفصلة.
الإجابة: ?
2) حقن SQL جذره خلط البيانات بـ .
الإجابة: الأمر
3) الطبقة التي تحدّ الضرر إن نجح حقن هي أقل .
الإجابة: الصلاحيات

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

1) ماذا يرد الخادم الآمن على حقن الدخول x' OR '1'='1؟ POST /login

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)`);}); // ✓ يفصل القيمة عن نص الأمر بعلامات ? (استعلام معلَّم)app.post('/login', (req, res) => {  const sql = "SELECT name, role FROM users WHERE name = ? AND pass = ?";  db.get(sql, [req.body.name, req.body.pass], (err, row) => {    if (err) return res.status(500).json({ error: 'خطأ في الاستعلام' });    if (!row) return res.status(401).json({ error: 'بيانات الدخول خاطئة' });    res.json({ welcome: row.name, role: row.role });  });}); app.listen(3000);
الاستجابة الصحيحة:
{"error":"بيانات الدخول خاطئة"}
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».

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