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

Whitelisting ORDER BY Sort Columns حماية أعمدة الترتيب ORDER BY بالقائمة البيضاء

ابنِ فلاتر بحث ديناميكية بـ LIKE وIN، وأمّن الترتيب بـ ORDER BY، ونفّذ تقسيم الصفحات Pagination عبر LIMIT وOFFSET في PDO.
1 صفوف تعليمية
PHP
0 مشاهدة

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

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

لا تربط المعاملات المحضرة إلا قيم البيانات فقط، ولا يمكنها ربط أسماء الأعمدة أو اتجاه الترتيب (ASC وDESC) في جملة ORDER BY.

  • إذا كتبت ORDER BY :sort، فستعتبر قاعدة البيانات المعامل نصاً ثابتاً ولن تقوم بترتيب الصفوف فعلياً.
  • تحقق دائماً من عمود الترتيب المطلوب عبر قائمة بيضاء صارمة بالدالة in_array($sort, $allowedColumns, true) مع تحديد عمود افتراضي آمن.
  • اضبط اتجاه الترتيب بصرامة عبر تعبير مثل $dir = strtoupper($inputDir) === "DESC" ? "DESC" : "ASC";.

لا يُدرج اسم العمود في ORDER BY إلا بعد تأكيد وجوده ضمن القائمة البيضاء المعتمدة عبر in_array($userSort, $allowed, true).

مخطط تدفق التنفيذ العملي لقسم حماية أعمدة الترتيب ORDER BY بالقائمة البيضاء في لغة PHP
PHP
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE products (id INT, price INT)');
$pdo->exec('INSERT INTO products VALUES (1, 300), (2, 120), (3, 450)');
$userSort = 'price';
$allowed = ['id', 'price'];
$col = in_array($userSort, $allowed, true) ? $userSort : 'id';
$dir = 'ASC';
$prices = $pdo->query("SELECT price FROM products ORDER BY $col $dir")->fetchAll(PDO::FETCH_COLUMN);
echo implode(' -> ', $prices) . "\n";