تكرار السؤال: …
الإجابة المختصرة
تفصل الاستعلامات المجهزة كود SQL عن البيانات عبر معلمات نائبة ($1, ?)، حيث ترسل للمحرك كبيانات حرفية بحتة لا يمكن تفسيرها كتعليمات برمجية.
الشرح
دمج نصوص المستخدم مباشرة عبر template literals (مثل `SELECT * WHERE name = '${input}'`) يتيح للمهاجم حقن أوامر تخريبية. عند استخدام الاستعلامات المجهزة، تقوم قاعدة البيانات بتحليل وبناء شجرة تنفيذ الـ SQL مسبقاً، ثم تعامل مدخلات المستخدم كقيم ثابتة مجردة حتى لو احتوت على فواصل أو كلمات محجوزة مثل OR أو DROP TABLE.
مثال بالكود
// آمن تماماً
await db.query("SELECT * FROM users WHERE email = $1 AND role = $2", [email, role]);أخطاء شائعة
- استخدام الـ string interpolation مع مكتبات قواعد البيانات بحجة أن المدخلات مفحوصة.