بناء تطبيق قوي تحدٍّ لكل مطور. إليك بعض أفضل الممارسات التي أتبعها في مشاريعي.
تعطيل «X-Powered-By»
المشكلة:
يمكن للمهاجمين فهم معلومات الخلفية بقراءة رأس X-Powered-By وإيجاد نقاط الضعف بسهولة.
الحل:
✅ أزل الرأس بطريقة express disable.
// ExpressJs
const app = express();
app.disable('x-powered-by');
// NestJs
const app = await NestFactory.create<INestApplication & Application>(AppModule);
app.disable('x-powered-by');
// أو
import helmet from 'helmet';
app.use(helmet());إزالة اسم «Server» من الرأس
المشكلة:
يكشف هذا الرأس برنامج الخادم الذي تستخدمه (مثل nginx أو Apache).
الحل:
// Express.js
app.use(helmet.hidePoweredBy());
// Nginx
server_tokens off;منع تنفيذ eval
المشكلة:
يمكن للمخترقين حقن كود ضار. إذا خدعوا تطبيقك لتشغيل eval() يمكنهم سرقة البيانات أو السيطرة.
الحل:
✅ استخدم Helmet مع CSP لمنع eval() في الواجهة
app.use(
helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"],
},
},
})
);✅ شغّل Node.js بعلم --no-eval
node --no-eval server.jsحقن SQL وNoSQL
المشكلة:
يمكن للمهاجمين حقن استعلامات ضارة عبر حقول إدخال غير منظّفة للقراءة أو التعديل أو الحذف.
الحل:
✅ استخدم مكتبات ORM/ODM مثل Sequelize وMongoose
✅ استخدم استعلامات ذات معاملات بدل دمج النصوص
✅ نظّف إدخال المستخدم قبل المعالجة
// آمن
const user = await db.query("SELECT * FROM users WHERE id = ?", [req.params.id]);البرمجة النصية عبر المواقع (XSS)
المشكلة:
يحقن المهاجمون سكربتات ضارة في الصفحات تُنفَّذ في متصفح المستخدم.
الحل:
✅ اهرب المحتوى المولَّد من المستخدم قبل العرض
✅ استخدم رؤوس أمان (CSP، X-XSS-Protection)
✅ استخدم مكتبات مثل DOMPurify لتنظيف HTML
تزوير الطلبات عبر المواقع (CSRF)
المشكلة:
يخدع المهاجم المستخدمين لإجراء طلبات غير مقصودة دون علمهم.
الحل:
✅ استخدم رموز CSRF
✅ استخدم كوكيز SameSite
✅ أكّد الإجراءات الحساسة بإعادة المصادقة
المصادقة واختطاف الجلسة
المشكلة:
آليات مصادقة ضعيفة تسمح بسرقة جلسات المستخدمين.
الحل:
✅ استخدم تجزئة كلمات مرور قوية (bcrypt، Argon2)
✅ فرض المصادقة متعددة العوامل
✅ كوكيز جلسة آمنة (HttpOnly، Secure، SameSite)
✅ تحديد المعدل لمنع هجمات القوة الغاشمة
تفويض معطوب
المشكلة:
يمكن للمستخدمين الوصول لموارد غير مصرح بها بسبب فحوصات صلاحيات غير صحيحة.
الحل:
✅ استخدم التحكم بالوصول القائم على الأدوار (RBAC)
✅ فرض قواعد تفويض API صارمة
✅ لا تثق بـ req.body أو req.user.role دون تحقق
إعدادات أمان خاطئة
المشكلة:
تعريض بيانات اعتماد افتراضية أو تتبعات مكدس أو خدمات غير ضرورية أو تبعيات قديمة.
الحل:
✅ عطّل تتبعات المكدس في الإنتاج
✅ استخدم متغيرات البيئة بدل الأسرار المثبتة
✅ حدّث التبعيات (npm audit fix)
✅ استخدم helmet لرؤوس HTTP الآمنة
رفض الخدمة (DoS) وتحديد المعدل
المشكلة:
يرسل المهاجمون طلبات ضخمة لاستنزاف موارد الخادم.
الحل:
✅ استخدم تحديد المعدل (express-rate-limit أو Throttler في NestJS)
✅ تحقق من الطلبات لمنع الحمولات الكبيرة
✅ موازنة الحمل والتخزين المؤقت
app.use(express.json({ limit: '300kb' }));تجنب التعبيرات النمطية الخطرة
التعبيرات النمطية مفيدة لكن قد تستهلك معالجاً مفرطاً. استخدم مكتبات تحقق مثل validator.js، وإذا استخدمت regex تحقق بـ safe-regex.
أضف الرؤوس الضرورية لمزيد من الأمان
Strict-Transport-Security (HSTS)
يجبر المتصفح على HTTPS فقط.
X-Content-Type-Options
يمنع المتصفحات من تخمين نوع MIME.
X-Frame-Options
يمنع هجمات clickjacking.
Referrer-Policy
يتحكم في معلومات المرجع المشتركة.
Permissions-Policy
يقيّد الوصول للكاميرا والميكروفون والموقع.
الخلاصة
شكراً لقراءة المقال! لا يمكن جعل أي شيء آمناً 100% على الإنترنت، لكن يمكننا جعل تطبيقاتنا أكثر أماناً. استخدام هذه الإعدادات يقلل المخاطر ويحسّن الأمان. أعتقد أن كل مطور يجب أن يضبط هذا عند إعداد المشروع.


