طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 243 · أمن الويب
الدرس 4 · الوحدة 2: ثغرات أمن الويب الشائعة

كيف تحدث الثغرات: الثقة بالمدخلات

لماذا تقع الثغرات أصلًا؟ ولماذا يكفي دفاعان لأغلبها؟ ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تشرح الجذر المشترك لثغرات الحقن: خلط البيانات بالتعليمات.
  • تميّز بين الفصل والترميز دفاعين جذريين.
  • تختار الدفاع بحسب وجهة المدخل (SQL، HTML، أمر نظام).
  • تطبّق قاعدة الثقة: كل مدخل خارجي عدائي.

١الجذر الواحد لأغلب الثغرات

بعد أن عرفنا الفئات، نسأل: لماذا تحدث؟ أغلب ثغرات الحقن — وهي أخطرها — جذرها فكرة واحدة: خلط البيانات بالتعليمات. حين يُدمج ما كتبه المستخدم (بيانات) داخل أمر أو صفحة (تعليمات)، قد ينقلب المدخل إلى تعليمة تُنفَّذ.

يُدمج في أمر أو صفحة

يُفصل أو يُرمَّز

مدخل المستخدم

كيف يُعامَل؟

يصبح تعليمات — ثغرة حقن

يبقى بيانات — آمن

المصير يتحدد بمعاملة المدخل: تعليمات فيقع الحقن، أو بيانات فيأمن.

الاسم يُفترض أن يكون بيانات تُعرض. لكن إن دُمج في قالب HTML بلا معالجة، فما يمنع المستخدم من أن يكتب وسمًا بدل اسمه؟ جرّب:

const express = require('express');const app = express();app.use(express.json());app.use(express.urlencoded({ extended: false })); const products = { 1: 'سماعة', 2: 'لوحة مفاتيح' }; // ✗ الخطر: يبني رسالة الترحيب بدمج اسم المستخدم مباشرة في قالبapp.get('/welcome', (req, res) => {  const name = req.query.name || 'زائر';  res.send('<h1>أهلًا ' + name + '</h1>');    // الاسم يصبح جزءًا من الصفحة}); app.listen(3000);

المدخل الثاني تحوّل إلى وسم HTML فعليّ أثّر في الصفحة. لو كان وسم script لنُفِّذ كود المهاجم في متصفح الضحية (هذا هو XSS، الدرس 8).

٢الدفاعان الجذريان

لأن السبب واحد، فالدفاع صنفان يتكرران في كل المقرر:

الدفاعالفكرةأمثلة لاحقة
الفصل Separationافصل البيانات عن الأمر بنيويًّا، فلا تُدمج أصلًاالاستعلامات المعلَّمة (الدرس 9)
الترميز Encoding/Escapingحوّل المحارف الخطرة إلى صورتها الحرفية قبل الدمجترميز مخرجات HTML (الدرس 10)

انظر الفرق: الدالة escapeHtml تحوّل < إلى &lt; فيُعرض نصًّا لا وسمًا:

const express = require('express');const app = express();app.use(express.json());app.use(express.urlencoded({ extended: false })); function escapeHtml(s) {  return String(s).replace(/[&<>"]/g, c =>    ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]));} app.get('/welcome', (req, res) => {  const name = req.query.name || 'زائر';  res.send('<h1>أهلًا ' + escapeHtml(name) + '</h1>');   // الاسم بيانات لا وسم}); app.listen(3000);

الآن يظهر النص «غامق» كما كُتب، لأن المحارف الخاصة رُمِّزت فبقيت بيانات. القاعدة: البيانات تبقى بيانات.

٣قاعدة الثقة

تلخّص كل ما سبق في قاعدة واحدة تحكم تصميمك:

السياق الذي يذهب إليه المدخلالدفاع المناسب
استعلام قاعدة بياناتاستعلام معلَّم (فصل)
صفحة HTMLترميز HTML (ترميز)
أمر نظام تشغيلتجنّبه، أو واجهة برمجية بلا صدفة
رابط أو إعادة توجيهقائمة وجهات مسموحة

لاحظ أن الدفاع يتبع الوجهة: المدخل نفسه قد يكون آمنًا في سياق وخطرًا في آخر. لذلك نطهّر عند الإخراج لكل سياق، لا مرة واحدة عند الإدخال.

توقّع وتحقّق

الجذر المشترك لأغلب ثغرات الحقن:

تحويل < إلى &lt; قبل الدمج في HTML هو:

الاستعلام المعلَّم مثال على:

متى نطهّر المدخل؟

الخلاصة

تحدٍّ تصميمي: تشخيص الجذر والدفاع

متوسط

لكل حالة من الحالات التالية في متجر «رفيق»، حدّد: هل المدخل عومل بيانات أم تعليمات؟ وما الدفاع الجذري المناسب (فصل أم ترميز)؟

المطلوب:
  • (أ) اسم المستخدم يُدمج في قالب HTML للصفحة.
  • (ب) حقل البحث يُدمج في نص استعلام SQL.
  • لكل حالة: نوع الخلل ثم الدفاع المناسب مع سببه في سطر.
✓ التحقق الآلي: يفحص المختبر بنية مستندك وصياغته (لا يحكم على جودة الفكرة؛ هذا دور معلمك)
  • (أ) يُعامل تعليمات
  • (أ) الدفاع الترميز
  • (ب) الدفاع الفصل
  • القاعدة تذكر عدم الدمج أو الثقة

💡 تلميح 1
الاسم في HTML يصبح وسمًا → سياقه HTML → الدفاع الترميز.
💡 تلميح 2
البحث في SQL يصبح أمرًا → سياقه قاعدة بيانات → الدفاع الفصل بالاستعلام المعلَّم.
💡 تلميح 3
الدفاع يتبع وجهة المدخل، لا نوعه عند الإدخال.

نموذج واحد من إجابات كثيرة صحيحة.

(أ) الاسم في HTML — الخلل والدفاع
الاسم يُدمج في الصفحة فيصبح تعليمات HTML قد تحمل وسمًا أو script.
الدفاع: الترميز، بتحويل المحارف الخاصة (< > & ") إلى صورتها الحرفية قبل الدمج، فيبقى نصًّا يُعرض لا وسمًا يُنفَّذ.
(ب) البحث في SQL — الخلل والدفاع
نص البحث يُدمج في الاستعلام فيصبح جزءًا من أمر SQL قد يغيّر منطقه.
الدفاع: الفصل، باستخدام استعلام معلَّم يمرّر القيمة منفصلة عن نص الأمر، فلا تُفسَّر تعليماتٍ أبدًا.
القاعدة العامة في سطر
عامِل كل مدخل خارجي على أنه عدائي، ولا تدمجه في تعليمات؛ افصله أو رمّزه بحسب وجهته.
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

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