هندسة الأمان

كيفية منع SQL Injection و XSS: دليل الوقاية الكامل مع الكود

منع هجمات SQL injection و NoSQL injection و XSS مع أنماط كود مُتحقق منها. يغطي الاستعلامات المعاملة وتعقيم المدخلات وتكوين CSP.

Khalid Aboubakr
18 دقيقة قراءة
Sql InjectionXssNosql InjectionInput SanitizationSecurityCspParameterized Queries

مقدمة

تظل هجمات الحقن أخطر ثغرات تطبيقات الويب. تحدث عندما يُرسل بيانات غير موثوقة إلى مُفسر كجزء من أمر أو استعلام.

منع حقن SQL

الاستعلامات المعلمة

// ❌ أبداً: دمج السلاسل const query = `SELECT * FROM users WHERE email = '${email}'`; // ✅ دائماً: الاستعلامات المعلمة const result = await pool.query( 'SELECT * FROM users WHERE email = $1', [email] ); // باستخدام Prisma const user = await prisma.user.findUnique({ where: { email }, });

بناء الاستعلام الديناميكي

function buildSearchQuery(filters: SearchFilters) { let query = knex('products').select('*'); if (filters.category) { query = query.where('category', filters.category); } // ترتيب ديناميكي آمن const allowedSortFields = ['name', 'price', 'created_at']; if (filters.sortBy && allowedSortFields.includes(filters.sortBy)) { query = query.orderBy(filters.sortBy, filters.sortOrder === 'desc' ? 'desc' : 'asc'); } return query; }

منع حقن NoSQL

// ❌ عرضة لحقن NoSQL const user = await db.collection('users').findOne({ username: req.body.username, password: req.body.password, // المهاجم يمكنه إرسال { "$gt": "" } }); // ✅ تحقق من أنواع المدخلات وعقمها const loginSchema = z.object({ username: z.string().min(1).max(50), password: z.string().min(1).max(100), }); const { username, password } = loginSchema.parse(req.body);

منع XSS

ترميز المخرجات

import DOMPurify from 'isomorphic-dompurify'; function sanitizeHtml(html: string): string { return DOMPurify.sanitize(html, { ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a', 'p'], ALLOWED_ATTR: ['href', 'title'], }); } // React يهرب تلقائياً افتراضياً function UserProfile({ user }) { return ( <div> {/* آمن */} <h1>{user.name}</h1> {/* ✅ آمن - عقم أولاً */} <div dangerouslySetInnerHTML={{ __html: sanitizeHtml(user.bio) }} /> </div> ); }

سياسة أمان المحتوى

res.setHeader('Content-Security-Policy', [ "default-src 'self'", "script-src 'self' 'nonce-...'", "frame-ancestors 'none'", ].join('; '));

الخلاصة

منع الحقن يتطلب:

  1. لا تثق بمدخلات المستخدم أبداً - تحقق وعقم كل شيء
  2. استخدم الاستعلامات المعلمة - لا تدمج SQL أبداً
  3. تحقق من أنواع البيانات - خاصة لـ NoSQL
  4. رمز المخرجات - ترميز مناسب للسياق
  5. نفذ CSP - دفاع متعدد الطبقات ضد XSS

الدفاع المتعدد الطبقات هو المفتاح - طبقات حماية متعددة تضمن أنه إذا فشلت واحدة، الأخرى لا تزال تحميك.

مقالات ذات صلة