انتقل إلى محتوى الدرس

How Prepared Statements Separate Code فصل الكود عن البيانات المحضرة

تعلّم الحماية من ثغرات حقن قواعد البيانات SQL Injection واستخدام الاستعلامات المحضرة (PREPARE و EXECUTE) في MySQL 8 مع أمثلة وتطبيقات تفاعلية.
1 صفوف تعليمية
MySQL
7 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

تقضي الاستعلامات المحضرة مسبقاً (Prepared Statements / Parameterized Queries) على ثغرات حقن SQL نهائياً، لأنها تفصل فصلاً تاماً بين مرحلة بناء هيكل الاستعلام ومرحلة إرسال البيانات عبر مرحلتين مستقلتين في بروتوكول MySQL:

  • المرحلة الأولى — التحضير والترجمة (PREPARE): يرسل التطبيق نص الاستعلام مزوداً بعلامات استفهام (?) كمواضع حجز للقيم: SELECT id, email FROM users WHERE email = ?. يقوم خادم MySQL بتحليل الجملة نحوياً وبناء شجرة التنفيذ وتثبيتها نهائياً.
  • المرحلة الثانية — التنفيذ وتمرير القيم (EXECUTE): يرسل التطبيق قيم المتغيرات في حزمة مستقلة تماماً. وبما أن شجرة الاستعلام قد بُنيت واكتملت في المرحلة الأولى، يضع الخادم القيمة المرسلة داخل الخانة المخصصة لها كبيانات حرفية صمّاء، ولا يمررها على محلل أوامر SQL أبداً!
  • ميزة الأداء عند التكرار: عند تنفيذ نفس الاستعلام مئات المرات بقيم مختلفة، يوفر التحضير المسبق وقت التحليل النحوي المتكرر.
المرحلة 1 (PREPARE) : يبني الخادم هيكل الأمر -> SELECT id FROM users WHERE email = [PARAM_1]
المرحلة 2 (EXECUTE) : يضع القيمة كنص حرفي   -> [PARAM_1] = "' OR '1'='1" (استحالة تغيير الهيكل!)
SQL
PREPARE safe_lookup FROM
  'SELECT id, email, status FROM customers WHERE email = ? AND status = ?';

SET @email_param  = '[email protected]';
SET @status_param = 'active';

EXECUTE safe_lookup USING @email_param, @status_param;
DEALLOCATE PREPARE safe_lookup;