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

أقل الصلاحيات و HTTPS ورؤوس الأمان

قبل سدّ كل ثغرة على حدة: مبادئ ورؤوس تحمي تطبيقك كله. ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تطبّق مبدأ أقل الصلاحيات والدفاع بالعمق.
  • تشرح ما يحميه HTTPS وأين يُستخدم.
  • تضيف رؤوس الأمان بـ helmet وتخفي بصمة الخادم.
  • تدرك خطر المكوّنات القديمة وطرق فحصها.

١مبادئ تحكم كل قرار

قبل الثغرات المحددة، ثلاثة مبادئ تحكم التصميم الآمن كله، من الخطة: «تطبيق مبادئ أمان الويب مثل أقل الصلاحيات (Least Privilege) و HTTPS».

المبدأالمعنىتطبيق
أقل الصلاحياتامنح كل طرف أدنى صلاحية تكفي لعمله فقطحساب القاعدة للتطبيق لا يملك DROP TABLE
الدفاع بالعمقطبقات متتالية، إن أخطأت واحدة أمسكت الأخرىتحقق في الواجهة والخادم والقاعدة
الفشل الآمنعند الخطأ، ارفض لا تسمحخطأ في التحقق ← امنع الوصول
التبسيطالكود الأبسط أقل ثغراتلا تكتب تشفيرك بنفسك

«أقل الصلاحيات» أهمها أثرًا: لو اخترق مهاجم جزءًا، فالضرر محدود بصلاحية ذلك الجزء. حساب قاعدة بيانات التطبيق يجب ألا يملك صلاحية حذف الجداول، فحتى لو نجح حقن SQL لن يمحو القاعدة.

٢HTTPS أولًا

HTTPS يشفّر كل ما ينتقل بين المتصفح والخادم، فيمنع تنصّت الشبكة (تهديد كشف المعلومات) والعبث بالبيانات في الطريق (تهديد العبث). بدونه، كل كلمة مرور ورمز جلسة يسير نصًّا مكشوفًا على الشبكة.

بدون HTTPSمع HTTPS
كلمة المرور تسير نصًّا مكشوفًامشفّرة في الطريق
يمكن حقن سكربت في الصفحة شبكيًّاالمحتوى موقّع ضد العبث
رمز الجلسة قابل للالتقاطمحمي، خاصة مع كوكي Secure

وفي العمل الحقيقي يُضاف رأس Strict-Transport-Security (HSTS) ليُلزم المتصفح باستخدام HTTPS دائمًا. وهذا أحد ما تضيفه مكتبة helmet تلقائيًّا.

٣رؤوس الأمان وبصمة الخادم

الخادم الافتراضي يكشف معلومات ويفتقر لرؤوس الحماية. انظر خادمًا عاريًا: يعلن أنه Express في رأس X-Powered-By، فيسهّل على المهاجم البحث عن ثغرات هذه النسخة:

const express = require('express');const app = express();app.use(express.json());app.use(express.urlencoded({ extended: false })); app.get('/', (req, res) => res.json({ app: 'متجر رفيق' }));app.listen(3000);

لاحظ الرأس X-Powered-By: Express. وهو هدية للمهاجم: يعرف منصتك فيبحث عن ثغراتها المعروفة.

الحل سطران: إخفاء البصمة، وإضافة رؤوس الأمان بمكتبة helmet التي تضيف حزمة رؤوس وقائية بإعداد واحد:

const express = require('express');const helmet = require('helmet');const app = express(); app.disable('x-powered-by');          // أخفِ أن الخادم Expressapp.use(helmet());                    // أضف رؤوس الأمان القياسية app.get('/', (req, res) => res.json({ app: 'متجر رفيق' }));app.listen(3000);

اختفى X-Powered-By، وأُضيفت رؤوس مثل Content-Security-Policy و X-Content-Type-Options و Strict-Transport-Security. كل رأس يسدّ بابًا.

الرأسيحمي من
Content-Security-Policyتنفيذ سكربتات غريبة (XSS)
X-Content-Type-Optionsتخمين المتصفح لنوع المحتوى
X-Frame-Optionsتضمين موقعك في إطار (clickjacking)
Strict-Transport-Securityالنزول إلى HTTP غير المشفّر

توقّع وتحقّق

«أقل الصلاحيات» يعني:

HTTPS يحمي أساسًا:

رأس X-Powered-By يُفضَّل:

مكتبة helmet تضيف:

الخلاصة

تحدٍّ برمجي: تحصين خادم «رفيق»

متوسط

هذا الخادم يعمل لكنه مكشوف: يعلن أنه Express ولا يحمل أي رأس أمان. حصّنه دون تغيير مساراته.

المطلوب:
  • أخفِ الرأس X-Powered-By.
  • أضف رؤوس الأمان القياسية بمكتبة helmet.
  • أبقِ المسارين / و /health يعملان كما هما.
👀 اعرض الاستجابات المطلوبة
✓ التحقق الآلي: يشغّل المختبر خادمك من جديد ويرسل إليه هذه الطلبات بالترتيب ثم يفحص الردود
  1. GET /
  2. GET /health
  • الخادم يعمل ويرد على كل الطلبات بلا أخطاء غير معالَجة
  • المسار / يعمل ← 200
  • الصفحة الرئيسية ترد باسم المتجر
  • المسار /health يعمل ← 200
  • لا يكشف X-Powered-By
  • يضيف رأس X-Content-Type-Options
  • يستخدم helmet

💡 تلميح 1
في الأعلى: const helmet = require('helmet');.
💡 تلميح 2
لإخفاء البصمة: app.disable('x-powered-by');.
💡 تلميح 3
لإضافة الرؤوس: app.use(helmet()); قبل المسارات.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

const express = require('express');const helmet = require('helmet');const app = express(); app.disable('x-powered-by');app.use(helmet()); app.get('/', (req, res) => res.json({ app: 'متجر رفيق' }));app.get('/health', (req, res) => res.json({ ok: true }));app.listen(3000);
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

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