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