كونكت للتقنية Connect4Techsكونكت للتقنية Connect4Techs
أدوات مجانية: حاسبة Subnet · امتحانات تجريبية · قاموس المصطلحات ←
أمن المعلومات

SQL Injection (حقن SQL)

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

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

كيف تحدث الثغرة؟

تخيل صفحة تسجيل دخول تبني الاستعلام هكذا:

"SELECT * FROM users WHERE name = '" + username + "' AND pass = '" + password + "'"

إذا كتب شخص في خانة كلمة المرور قيمة مثل ' OR '1'='1، يتحول الشرط إلى عبارة صحيحة دائماً، وقد يُسمح بالدخول دون كلمة مرور. هذا مثال توضيحي بسيط، أما في الواقع فقد يستخدم المهاجمون الثغرة لاستخراج قواعد بيانات كاملة، أو تعديل البيانات وحذفها، وأحياناً تنفيذ أوامر على السيرفر حسب نوع قاعدة البيانات وصلاحياتها.

الأنواع الشائعة

  • In-band: تظهر النتائج أو رسائل الخطأ مباشرة في الصفحة.
  • Blind SQLi: لا تظهر النتائج، لكن المهاجم يستنتجها من اختلاف سلوك الصفحة أو زمن الاستجابة.
  • Out-of-band: إخراج البيانات عبر قناة أخرى كطلبات DNS.

مثال واقعي

في عام 2015 تعرضت شركة الاتصالات البريطانية TalkTalk لاختراق سُربت فيه بيانات أكثر من 150 ألف عميل عبر ثغرة SQL Injection في صفحات ويب قديمة، وفرضت عليها هيئة حماية البيانات البريطانية غرامة قياسية حينها، مع انتقادات بأن الثغرة كانت معروفة ويسهل منعها.

كيف تمنع حقن SQL؟

  • الاستعلامات المُعلَّمة (Parameterized Queries / Prepared Statements): الحل الجذري، حيث تُرسل المدخلات كقيم منفصلة لا تُفسَّر كأوامر أبداً:
    cursor.execute("SELECT * FROM users WHERE name = %s", (username,))
  • استخدام ORM موثوق وتجنب بناء الاستعلامات يدوياً بدمج النصوص.
  • التحقق من المدخلات (Input Validation) بقوائم سماح للأنواع والأطوال.
  • مبدأ أقل الصلاحيات لحساب قاعدة البيانات الذي يستخدمه التطبيق.
  • إخفاء رسائل الأخطاء التفصيلية عن المستخدمين، واستخدام WAF كطبقة إضافية لا كبديل.
  • فحص الكود واختبار الاختراق الدوري للتطبيقات.

الفرق بين SQL Injection و XSS

كلاهما من ثغرات الحقن، لكن SQL Injection يستهدف قاعدة البيانات على السيرفر، بينما XSS يحقن سكربتات تُنفَّذ في متصفح المستخدمين الآخرين.