منع حقن SQL لتطبيقات الويب الحديثة

Security2026-09-12TryQuickToolBox

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

كيف يحدث حقن SQL

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

SELECT * FROM users WHERE username = '$username' AND password = '$password';

إذا أدخل مهاجم ' OR '1'='1 كاسم مستخدم وأي كلمة مرور، يصبح الاستعلام:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'anything';

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

1. استخدم العبارات المُعدة (الاستعلامات ذات المعاملات)

تفصل العبارات المُعدة كود SQL عن البيانات. تستقبل قاعدة البيانات بنية الاستعلام أولاً، ثم المعاملات، لذا لا يتم التعامل مع مدخلات المستخدم أبداً ككود SQL. هذا هو الدفاع الأكثر فعالية.

مثال في PHP مع PDO:

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(['email' => $userInput]);
$user = $stmt->fetch();

مثال في Java مع JDBC:

String sql = "SELECT * FROM users WHERE email = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, userInput);
ResultSet rs = stmt.executeQuery();

استخدم دائماً الاستعلامات ذات المعاملات لـجميع البيانات المقدمة من المستخدم، بما في ذلك حقول البحث والفلاتر ومعاملات الترتيب.

2. التحقق من المدخلات وتنقيتها

بينما تعد العبارات المُعدة الأساس، يضيف التحقق من المدخلات دفاعاً في العمق. تحقق من أن المدخلات تتطابق مع الأنماط المتوقعة (مثل تنسيق البريد الإلكتروني، المعرف الرقمي) وارفض أي شيء غير متوقع. على سبيل المثال، إذا كان يجب أن يكون المعرف عدداً صحيحاً، فقم بتحويله إلى int في الكود الخاص بك. تجنب القوائم السوداء للأحرف مثل علامات الاقتباس - يمكن للمهاجمين تجاوز مثل هذه الفلاتر.

3. استخدم ORM بأمان

عادةً ما تستخدم ORMs مثل Hibernate وEntity Framework وSequelize الاستعلامات ذات المعاملات افتراضياً. ومع ذلك، غالباً ما تسمح بأجزاء SQL خام. كن حذراً مع الطرق التي تقبل سلاسل نصية خام:

تحقق دائماً من وثائق ORM الخاص بك لبناء الاستعلامات الآمن.

4. اهرب البيانات إذا كانت العبارات المُعدة مستحيلة

في حالات نادرة حيث يجب عليك بناء SQL ديناميكي (مثل أسماء الجداول الديناميكية)، استخدم وظيفة الهروب الخاصة ببرنامج تشغيل قاعدة البيانات. بالنسبة لـ MySQL، تهرب mysqli_real_escape_string() الأحرف الخاصة. لكن تذكر: الهروب ليس بقوة العبارات المُعدة ويجب أن يكون الملاذ الأخير.

5. طبق أقل صلاحية لحسابات قاعدة البيانات

لا تتصل بقاعدة البيانات كـ root أو بمستخدم لديه صلاحيات كاملة. أنشئ مستخدم قاعدة بيانات مخصص لتطبيقك مع الأذونات الضرورية فقط (SELECT، INSERT، UPDATE، DELETE على جداول محددة). هذا يحد من الضرر إذا حدث حقن.

6. استخدم جدار حماية تطبيقات الويب (WAF)

يمكن لـ WAF اكتشاف وحظر أنماط حقن SQL الشائعة. بينما ليس بديلاً عن البرمجة الآمنة، إلا أنه يوفر طبقة إضافية. يقدم العديد من مزودي السحابة WAFs مُدارة يسهل تفعيلها.

7. الاختبار الأمني المنتظم

اختبر تطبيقك بحثاً عن ثغرات حقن SQL باستخدام الماسحات الآلية أو اختبار الاختراق اليدوي. يمكن لأدوات مثل SQLMap المساعدة في تحديد المشكلات. ادمج الاختبار الأمني في خط أنابيب CI/CD الخاص بك لاكتشاف الانحدارات مبكراً.

مقارنة تقنيات المنع

التقنية الفعالية سهولة التنفيذ
العبارات المُعدة عالية سهلة (مدمجة في معظم برامج التشغيل)
التحقق من المدخلات متوسطة معتدلة
الاستخدام الآمن لـ ORM عالية سهلة إذا كنت على دراية
الهروب متوسطة سهلة لكن عرضة للخطأ
أقل صلاحية متوسطة سهلة
WAF منخفضة إلى متوسطة سهلة (مُدارة)

الأسئلة الشائعة

ما هي الطريقة الأكثر فعالية لمنع حقن SQL؟

استخدام العبارات المُعدة مع الاستعلامات ذات المعاملات هو الطريقة الأكثر فعالية. يضمن أن مدخلات المستخدم لا يتم تفسيرها أبداً ككود SQL.

هل يمكن للتحقق من المدخلات وحده منع حقن SQL؟

لا. التحقق من المدخلات هو إجراء دفاع في العمق جيد، لكن لا ينبغي الاعتماد عليه وحده. يمكن للمهاجمين أحياناً تجاوز قواعد التحقق، لذا استخدم دائماً العبارات المُعدة كدفاع أساسي.

هل ORMs آمنة تلقائياً من حقن SQL؟

ORMs آمنة عموماً عند استخدامها بشكل صحيح، لكنها غالباً ما تسمح باستعلامات SQL خام يمكن أن تكون عرضة للخطر إذا قمت بدمج مدخلات المستخدم. استخدم دائماً الاستعلامات ذات المعاملات حتى داخل طرق ORM.

لمزيد من الأمان، فكر في استخدام JSON formatter لفحص والتحقق من استجابات API بأمان دون تنفيذ كود ضار.