أمان تطبيقات JavaScript: أهم 10 ثغرات أمنية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أمان تطبيقات JavaScript: أهم 10 نقاط ضعف



أصبحت JavaScript، خاصة في بيئة Node.js، أساسًا لتطوير الويب الحديث. ومع ذلك، فإن شعبيتها تجعل التطبيقات هدفًا جذابًا للهجمات. يمكن أن يؤدي تجاهل قضايا الأمان إلى تسرب البيانات وخسائر مالية وضرر بالسمعة. في هذه المقالة، سنستعرض أهم 10 نقاط ضعف حرجة في تطبيقات JavaScript (Node.js)، استنادًا إلى معيار OWASP Top 10، ونوضح كيفية منعها باستخدام أمثلة الكود.



1. الحقن (Injection)

لا يزال الحقن أحد أخطر التهديدات. في سياق Node.js، غالبًا ما نواجه حقن SQL وحقن NoSQL (على سبيل المثال، في MongoDB).



المشكلة

يسمح الربط المباشر لإدخال المستخدم في استعلامات قاعدة البيانات للمهاجم بتنفيذ كود عشوائي.



مثال على كود ضعيف

const user = req.body.username;const query = `SELECT * FROM users WHERE username = '${user}'`;db.query(query, callback);


الحل

استخدم الاستعلامات ذات المعلمات أو ORM/ODM. بالنسبة لـ MongoDB، استخدم mongo-sanitize.

const query = 'SELECT * FROM users WHERE username = $1';db.query(query, [user], callback);


2. خلل في المصادقة وإدارة الجلسات

المصادقة الضعيفة هي طريق مباشر لاختراق الحسابات.



المشكلة

استخدام رموز يمكن توقعها (مثل JWT مع خوارزمية none)، أو تخزين كلمات المرور بنص واضح، أو عدم وجود حد لعدد محاولات تسجيل الدخول.



مثال على الضعف

// JWT بدون التحقق من الخوارزميةconst token = jwt.sign({ user: 'admin' }, 'secret', { algorithm: 'none' });


الحل

  • تحقق دائمًا من خوارزمية JWT: jwt.verify(token, secret, { algorithms: ['HS256'] }).
  • قم بتخزين كلمات المرور باستخدام bcrypt أو argon2.
  • قم بتطبيق حد لمحاولات تسجيل الدخول (express-rate-limit).
const bcrypt = require('bcrypt');const saltRounds = 10;const hash = await bcrypt.hash(password, saltRounds);


3. XSS (البرمجة النصية عبر المواقع)

يسمح XSS بإدخال نص برمجي ضار في صفحة ويب، والذي يتم تنفيذه بعد ذلك في متصفح الضحية.



المشكلة

عرض محتوى المستخدم دون هروب، خاصة عند استخدام Server-Side Rendering (SSR) في Next.js أو Nuxt.js.



كود ضعيف (Express)

res.send(`<h1>Hello, ${req.query.name}</h1>`);


الحل

  • قم بهروب المخرجات: استخدم مكتبات escape-html أو محركات القوالب ذات الهروب التلقائي (EJS, Pug).
  • قم بتعيين رأس CSP (سياسة أمان المحتوى): helmet.contentSecurityPolicy().
const helmet = require('helmet');app.use(helmet.contentSecurityPolicy({  directives: { defaultSrc: ["'self'"] }}));


4. المراجع المباشرة غير الآمنة للكائنات (IDOR)

ينشأ هذا الضعف عندما يتمكن المستخدم من الوصول إلى الكائنات (ملفات، سجلات قاعدة بيانات) من خلال معرفة أو تخمين معرفها.



مثال

app.get('/api/user/:id', (req, res) => {  // لا يوجد تحقق من أن req.user.id === req.params.id  const user = db.findUser(req.params.id);  res.json(user);});


الحل

تحقق دائمًا من صلاحيات الوصول على مستوى الخادم.

if (req.user.id !== req.params.id) {  return res.status(403).send('Forbidden');}


5. تكوين أمان غير آمن

يشمل ذلك استخدام بيانات اعتماد افتراضية، وأوضاع التصحيح في بيئة الإنتاج، بالإضافة إلى إعدادات CORS غير الصحيحة.



المشكلة

// CORS مفتوحapp.use(cors({ origin: '*' }));


الحل

المدونات

توصيات الكتب