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

سطح الهجوم: الطلب والاستجابة بعين المهاجم

من أين يدخل المهاجم؟ من كل حقل في الطلب. فأين يكون التحقق؟ ⏱ نحو 35 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تحلّل الطلب والاستجابة بعين المهاجم.
  • تعدّد مصادر المدخلات وتعرف أنها كلها غير موثوقة.
  • تميّز الحدود الموثوقة من غير الموثوقة.
  • تختار رمز الحالة المناسب لكل موقف أمني.

١كل تطبيق ويب حوار من طلب واستجابة

درست في مقرر أطر الويب كيف يرد الخادم على الطلبات. الأمن يبدأ بإعادة النظر في الصورة نفسها بعين المهاجم: كل جزء من الطلب يكتبه المُرسِل، وقد لا يكون متصفحًا عاديًّا.

الخادمالمتصفح (أو المهاجم)كل هذه الحقول يتحكم بها المُرسِلطلب HTTP (مسار + استعلام + ترويسات + جسم)معالجة — هنا تقع الثغراتاستجابة (رمز الحالة + ترويسات + جسم)
الطلب كله يتحكم به من يرسله؛ والمعالجة في الخادم هي موضع الثغرات.

المهاجم لا يحتاج متصفحك ولا واجهتك. يرسل الطلب مباشرة بأداة سطر أوامر، فيضع في كل حقل ما يشاء. القاعدة الذهبية في أمن الويب كلها فرع عن هذه الجملة: لا تثق بأي شيء يأتي من العميل.

٢من أين تأتي المدخلات؟

جرّب هذا الخادم: يردّ لك بما استقبله من كل مصدر. انظر كيف أن قيمة الاستعلام والترويسة والجسم كلها قابلة لأن يضع فيها المرسل أي شيء:

const express = require('express');const app = express();app.use(express.json());app.use(express.urlencoded({ extended: false })); app.get('/echo', (req, res) => {  res.json({    path: req.path,    query: req.query,                 // ما بعد ؟ في الرابط    userAgent: req.headers['user-agent'],    language: req.headers['accept-language'],  });}); app.post('/order', (req, res) => {  res.json({ received: req.body });   // جسم الطلب كما أرسله العميل}); app.listen(3000);

لاحظ الطلب الثاني: أرسل العميل price=0. لو اعتمد الخادم هذا السعر لاشترى بلا مقابل. المدخل من العميل، فلا يُوثق به.

مصدر المدخلالمثاليتحكم به المهاجم؟
معامل المسار/user/42نعم: يجرّب 43 و 44…
سلسلة الاستعلام?sort=priceنعم
جسم الطلب{ "price": 0 }نعم
الترويساتUser-Agent, Cookieنعم؛ تُزوَّر بسهولة
رقم الحالة ورموز الخادم—لا؛ يصنعها خادمك

٣رموز الحالة بعين الأمن

ردّ الخادم يحمل رمز حالة، وله معنى أمني: ماذا تخبر به المهاجم؟

الرمزالمعنىملحوظة أمنية
200نجح—
400طلب خاطئللمدخلات غير الصالحة
401لم تُصادَقسجّل الدخول أولًا
403ممنوعمصادَق لكن بلا صلاحية
404غير موجوديُستخدم أحيانًا بدل 403 لإخفاء وجود المورد
429طلبات كثيرةتحديد المعدل ضد التخمين (الدرس 13)

الفرق بين 401 و 403 و 404 سيعود كثيرًا: أحيانًا نردّ 404 عمدًا على مورد موجود لا يملكه الطالب، حتى لا نؤكد له وجوده.

توقّع وتحقّق

المهاجم يرسل الطلب بأداة سطر أوامر. ماذا يستطيع التحكم به؟

التحقق من المدخلات في JavaScript بالمتصفح وحده:

أي رمز يناسب «مصادَق لكن بلا صلاحية»؟

اعتماد price من جسم الطلب يكسر:

الخلاصة

تحدٍّ تصميمي: خريطة سطح الهجوم

تمهيدي

أمامك مسار في متجر «رفيق» يعرض ملف العميل ويحدّثه: PATCH /api/customers/:id بجسم فيه الاسم والبريد. حلّل سطح الهجوم بملء الحقول.

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

💡 تلميح 1
المدخلات ثلاثة: معامل المسار، وجسم الطلب، والترويسة التي تحمل الهوية.
💡 تلميح 2
الخطر في المعرّف id لأنه يحدد صاحب الملف، والمهاجم يغيّره.
💡 تلميح 3
التحقق في الواجهة يُتجاوز لأن الطلب يُرسل مباشرة دون متصفح.

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

مصادر المدخلات (سطر لكل مصدر)
معامل المسار id: رقم العميل المراد تعديله.
جسم الطلب: الاسم والبريد الجديدان.
ترويسة الهوية (الرمز/الكوكي): لتحديد من المستخدم الحالي.
الحقل الخطر وسببه
معامل id: قد يضع المهاجم رقم عميل آخر ليعدّل ملفه، فلا بد من التحقق أن الملف يخصّه.
لماذا لا يكفي التحقق في الواجهة
لأن المهاجم يرسل الطلب مباشرة بلا متصفح، فيتجاوز أي تحقق مكتوب في JavaScript بالواجهة؛ التحقق يجب أن يكون في الخادم.
رمز الحالة لتعديل ملف غيره وسببه
404: حتى لا نؤكد للمهاجم وجود ملف ذلك العميل؛ أو 403 إن أردنا التصريح بأنه ممنوع.
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

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