شرح صفوف ومحتوى الفقرة
قاعدة هندسية بالغة الأهمية: علامات الاستفهام (?) في الاستعلامات المحضرة تقبل قيم البيانات فقط، ولا يمكن استخدامها لتمرير أسماء الجداول أو أسماء الأعمدة أو كلمات الترتيب مثل 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;