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

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

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

ابدأ الدورة

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



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



1. XSS (Cross-Site Scripting)

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



// كود ضعيفapp.get('/search', (req, res) => {    const query = req.query.q;    res.send(`<h2>نتائج البحث لـ: ${query}</h2>`);});

// نسخة آمنةconst escapeHtml = (str) => { return str.replace(/&/g, '&amp;') .replace(/</g, '&lt;') .replace(/>/g, '&gt;') .replace(/"/g, '&quot;') .replace(/'/g, '&#039;');};

app.get('/search', (req, res) => { const query = escapeHtml(req.query.q || ''); res.send(`<h2>نتائج البحث لـ: ${query}</h2>`);});


2. SQL Injection

يحدث حقن كود SQL عندما يتم دمج إدخال المستخدم مباشرة في استعلام SQL. يمكن أن يؤدي ذلك إلى تسريب البيانات أو حذفها.



// كود ضعيفconst userId = req.body.id;const query = `SELECT * FROM users WHERE id = ${userId}`;

// نسخة آمنة مع استعلامات معلمةconst userId = req.body.id;const query = 'SELECT * FROM users WHERE id = ?';db.query(query, [userId], (err, results) => { // معالجة النتائج});


3. إلغاء التسلسل غير الآمن

غالباً ما يستخدم Node.js JSON.parse()، ولكن إذا كنت تعمل مع تنسيقات أخرى (مثل Buffer)، يمكن للمهاجم إدخال بيانات ضارة.



// نهج خطيرconst data = JSON.parse(req.body.data); // قد يحتوي على __proto__

// نهج آمنconst safeParse = (json) => { const data = JSON.parse(json); // إزالة الخصائص الخطرة بشكل متكرر return JSON.parse(JSON.stringify(data));};


4. CSRF (Cross-Site Request Forgery)

هجوم يجبر فيه المهاجم المستخدم على تنفيذ إجراء غير مرغوب فيه على موقع يكون المستخدم مسجلاً دخوله إليه.



// تثبيت الحماية باستخدام csurfconst csrf = require('csurf');const csrfProtection = csrf({ cookie: true });

app.post('/transfer', csrfProtection, (req, res) => { // معالجة آمنة للتحويل});


5. المصادقة غير الآمنة

كلمات المرور الضعيفة، عدم وجود حد لمحاولات تسجيل الدخول، وتخزين كلمات المرور بنص واضح هي مشاكل شائعة.



// التجزئة الصحيحة لكلمات المرورconst bcrypt = require('bcrypt');

async function createUser(password) { const salt = await bcrypt.genSalt(12); const hash = await bcrypt.hash(password, salt); // حفظ hash في قاعدة البيانات}

async function checkPassword(plainPassword, hash) { return await bcrypt.compare(plainPassword, hash);}


6. تسريب البيانات السرية

إرسال تتبع الأخطاء إلى العميل أو تسجيل كلمات المرور هو خطأ شائع بين المطورين.



// غير صحيحapp.use((err, req, res, next) => {    res.status(500).json({ error: err.stack });});

// صحيحapp.use((err, req, res, next) => { console.error(err); // تسجيل في الخادم res.status(500).json({ error: 'خطأ داخلي في الخادم' });});


7. التكوين غير الآمن

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



// تكوين CORS آمنconst cors = require('cors');cons                

المدونات

توصيات الكتب