الدفاع ضد حقن SQL
امنعوا هجمات الحقن
الدفاع ضد حقن SQL درس مجاني في Cyber Security Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cyber Security Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cyber Security Academy 4 دروس في المجموع.
ما هو حقن SQL
يحدث حقن SQL (SQLi) عندما تُلحق مدخلات المستخدم غير الموثوقة مباشرةً باستعلام SQL. يُدخل المهاجم صياغة SQL خفية في حقل يتوقع التطبيق أن يحتوي على بيانات عادية، فيغيّر معنى الاستعلام.
ولا تزال هذه الثغرة من أخطر ثغرات الويب، لأنها قد تكشف قواعد بيانات كاملة أو تتجاوز عمليات تسجيل الدخول أو تتسبب في إتلاف البيانات.
استعلام معرّض للثغرات
الخطأ الشائع هو دمج السلاسل النصية. إذا كانت المدخلة هي tom فسيكون الاستعلام سليمًا، لكن المدخلة المصممة بعناية تعيد كتابة المنطق.
- تغلق علامة الاقتباس المفردة السلسلة النصية مبكرًا.
- يصبح كل ما يليها عبارة عن SQL قابل للتنفيذ.
query = "SELECT * FROM users WHERE name = '" + userInput + "'";
// userInput = tom' OR '1'='1
// becomes: SELECT * FROM users WHERE name = 'tom' OR '1'='1'تجاوز المصادقة
تُعد نماذج تسجيل الدخول هدفًا رئيسيًا. فمن خلال حقن شرط صحيح دائمًا والتعليق على بقية الاستعلام، يسجل المهاجم الدخول دون كلمة مرور.
تجعل السلسلة -- بقية العبارة تعليقًا، ولذلك يتم تجاهل التحقق من كلمة المرور.
-- attacker enters in the username field:
admin' --
-- resulting query:
SELECT * FROM users WHERE user = 'admin' --' AND pass = '...'الاستعلامات ذات المعلمات
الدفاع الأساسي هو الاستعلامات ذات المعلمات (العبارات المُعدّة مسبقًا). يُرسل هيكل SQL منفصلًا عن البيانات، ولذلك تُعامل المدخلة دائمًا كقيمة، لا كتعليمة برمجية.
يربط مشغّل قاعدة البيانات العناصر النائبة ? بالقيم المقدمة بأمان.
-- Python (sqlite3 / psycopg)
cur.execute(
'SELECT * FROM users WHERE name = ? AND pass = ?',
(username, password)
)العبارات المُعدّة مسبقًا في Java
توفر كل لغة رئيسية آلية لاستخدام المعلمات. في Java، استخدم PreparedStatement بدلًا من إنشاء السلاسل النصية باستخدام Statement.
لا يمكن للمعلمات المرتبطة الخروج من موضعها، ولذلك يصبح الحقن مستحيلًا بنيويًا هنا.
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();الإجراءات المخزنة
يمكن أن تساعد الإجراءات المخزنة عندما تستخدم مدخلات ذات معلمات داخليًا. لكن انتبه: فالإجراء المخزن الذي ينشئ SQL ديناميكيًا عبر دمج السلاسل النصية يكون معرّضًا للثغرات بالقدر نفسه.
- آمن: تمرير المعلمات إلى الإجراء.
- غير آمن: تنفيذ
EXEC()لسلاسل نصية مدمجة داخل الإجراء.
التحقق من المدخلات وقوائم السماح
يمثل التحقق طبقة دفاع ثانية مفيدة. استخدم قوائم السماح (لا تقبل إلا الأنماط المعروفة والصالحة) بدلًا من قوائم الحظر (محاولة منع الأحرف السيئة).
فعلى سبيل المثال، ينبغي أن يرفض حقل المعرّف الرقمي أي قيمة لا تتكون من أرقام قبل أن تصل إلى الاستعلام.
if not user_id.isdigit():
raise ValueError('invalid id')
# only then use the valueالهروب من المحارف هو الملاذ الأخير
يُعد إبطال تأثير علامات الاقتباس يدويًا أسلوبًا هشًا ومعرضًا للأخطاء. فقواعد الهروب تختلف بين قواعد البيانات، وقد تتجاوزها الحالات الخاصة، مثل حيل الترميز والحقن من الدرجة الثانية.
فضّل الاستعلامات ذات المعلمات. ولا تستخدم الهروب إلا عندما يتعذر على ORM أو المشغّل استخدام المعلمات لمعرّف محدد.
أقل قدر من الصلاحيات لحسابات DB
حدّ من أضرار أي عملية حقن ناجحة بتطبيق مبدأ أقل قدر من الصلاحيات على مستخدم قاعدة البيانات الخاص بالتطبيق.
- امنح صلاحيات
SELECTوINSERTوUPDATEعلى الجداول المطلوبة فقط. - لا تستخدم مطلقًا حساب المستخدم المتميز أو حساب
rootللتطبيق. - ارفض صلاحيات
DROPوFILEوحقوق الإدارة.
GRANT SELECT, INSERT, UPDATE ON appdb.orders TO 'webapp'@'%';
REVOKE DROP, ALTER ON appdb.* FROM 'webapp'@'%';أطر ORM ومنشئو الاستعلامات
تستخدم أطر ORM الحديثة (Hibernate وSequelize وDjango ORM وSQLAlchemy) المعلمات افتراضيًا، مما يزيل معظم مخاطر الحقن.
يعود الخطر عندما ينتقل المطورون إلى SQL الخام أو يستخدمون استيفاء السلاسل النصية في منشئ الاستعلامات. مرّر القيم دائمًا كمعلمات مرتبطة، حتى في الوضع الخام.
الدفاع متعدد الطبقات
لا تكفي أي وسيلة تحكم منفردة. اجمع بين عدة طبقات:
- استخدام الاستعلامات ذات المعلمات في كل مكان (الدفاع الأساسي).
- التحقق من المدخلات وقوائم السماح.
- حسابات DB ذات أقل قدر من الصلاحيات.
- جدار حماية لتطبيقات الويب (WAF) لاكتشاف الأنماط المعروفة.
- معالجة الأخطاء بحيث لا تكشف SQL أو تتبعات المكدس مطلقًا.
تحقق سريع
اختبر مدى فهمك للدفاع الأساسي.
مراجعة
تعلمت كيفية عمل حقن SQL وكيفية إيقافه:
- ينشأ SQLi من دمج المدخلات غير الموثوقة في الاستعلامات.
- تمثل الاستعلامات ذات المعلمات خط الدفاع الأساسي.
- أضف التحقق باستخدام قوائم السماح، وحسابات DB ذات أقل قدر من الصلاحيات، وWAF.
- تجنب الهروب اليدوي وإنشاء SQL ديناميكي داخل الإجراءات المخزنة.
يمنع الدفاع متعدد الطبقات تحول خطأ واحد إلى اختراق.
الأسئلة الشائعة
هل درس «الدفاع ضد حقن SQL» مجاني؟
نعم — نص درس «الدفاع ضد حقن SQL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Cyber Security Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Cyber Security Academy 4 دروس في المجموع.
ماذا ستتعلم في «الدفاع ضد حقن SQL»؟
امنعوا هجمات الحقن تتمرن على Cyber Security Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Cyber Security Academy؟
لا تُشترط خبرة سابقة. Cyber Security Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الدفاع ضد حقن SQL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Cyber Security Academy هذا؟
نعم. كل درس في Cyber Security Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.