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

Whitelisting Dynamic Identifiers القائمة البيضاء لأسماء الأعمدة

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

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

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

قاعدة هندسية بالغة الأهمية: علامات الاستفهام (?) في الاستعلامات المحضرة تقبل قيم البيانات فقط، ولا يمكن استخدامها لتمرير أسماء الجداول أو أسماء الأعمدة أو كلمات الترتيب مثل ASC / DESC! فكيف نسمح للمستخدم بترتيب النتائج حسب عمود يختاره بأمان تام؟

  • لماذا لا يعمل ORDER BY ? لترتيب الأعمدة؟ إذا مررت النص 'unit_price' مكان علامة الاستفهام في ORDER BY ?، فسيعامله MySQL كنص ثابت متساوٍ في كل الصفوف ولن يرتب الجدول!
  • الحل الأول — استخدام تعبير CASE الآمن داخل الاستعلام المحضر: مرر خيار المستخدم كقيمة عادية (?) داخل جملة CASE تحول الخيارات المسموحة فقط إلى الأعمدة الحقيقية المناظرة لها.
  • الحل الثاني — القائمة البيضاء الصارمة (Strict Whitelist): افحص اسم العمود المطلوب في كود التطبيق مقابل مصفوفة ثابتة من الأعمدة المسموحة فقط، وارفض أي قيمة خارج القائمة البيضاء فوراً.
+----+-------------------+------------+
| id | product_name      | unit_price |
+----+-------------------+------------+
| 10 | USB-C Hub         |      29.00 |
| 15 | NVMe SSD 2TB      |     149.00 |
+----+-------------------+------------+
SQL
PREPARE safe_sorted_products FROM
  'SELECT id, product_name, unit_price FROM products
   WHERE category = ?
   ORDER BY
     CASE WHEN ? = ''price_asc''  THEN unit_price END ASC,
     CASE WHEN ? = ''price_desc'' THEN unit_price END DESC,
     id ASC';
SET @cat = 'Storage', @sort = 'price_asc';
EXECUTE safe_sorted_products USING @cat, @sort, @sort;
DEALLOCATE PREPARE safe_sorted_products;