📚 محتوى دفاعي بحت: الهدف منع الثغرة في كودك.
كيف تحدث (مفهوميًّا)
تحدث عندما يُدمَج إدخال المستخدم مباشرة في نصّ استعلام SQL عبر ربط النصوص (string concatenation)، فيتمكّن مدخل خبيث من تغيير منطق الاستعلام.
// ❌ خطر: ربط مباشر لمدخل المستخدم
db.query("SELECT * FROM users WHERE name = '" + userInput + "'");
المشكلة: المُدخَل يصبح جزءًا من الأمر بدل أن يكون مجرّد بيانات.
الحلّ 1: الاستعلامات المعاملية (الأهمّ)
افصل الأمر عن البيانات — تُعامَل المدخلات كقيم لا كأوامر:
// ✅ آمن: معاملات (placeholders)
db.query("SELECT * FROM users WHERE name = ?", [userInput]);
# Python
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
الحلّ 2: استخدم ORM
أدوات مثل Drizzle و Prisma و Django ORM تستخدم استعلامات معاملية تلقائيًّا:
User.objects.filter(name=user_input) # آمن
دفاعات إضافية
- التحقّق من المدخلات (النوع، الطول، الصيغة).
- أقلّ صلاحية لمستخدم قاعدة البيانات.
- لا تكشف رسائل أخطاء SQL للمستخدم.
💡 القاعدة الذهبية: لا تبنِ استعلامات بربط نصوص المستخدم — استخدم المعاملات أو ORM دائمًا.
🎯 التالي: الحماية من XSS.