Да, для атак с использованием SQL-инъекций в качестве вектора может использоваться неэкранированное предложение ORDER BY. Вот объяснение того, как это можно использовать и как избежать этой проблемы здесь:
http://josephkeeler.com/2009/05/php-security-sql-injection-in-order-by/
В этом посте рекомендуется использовать белый список для проверки параметра ORDER BY, что почти наверняка является самым безопасным подходом.
Чтобы ответить на обновление, даже если предложение сложное, вы все равно можете написать подпрограмму, которая проверяет его по белому списку, например:
function validate_order_by($order_by_parameter) {
$columns = array('first_name', 'last_name', 'zip', 'created_at');
$parts = preg_split("/[\s,]+/", $order_by_parameter);
foreach ($parts as $part) {
$subparts = preg_split("/\s+/", $part);
if (count($subparts) < 0 || count($subparts) > 2) {
// Too many or too few parts.
return false;
}
if (!in_array($subparts[0], $columns)) {
// Column name is invalid.
return false;
}
if (count($subparts) == 2
&& !in_array(strtoupper($subparts[1]), array('ASC', 'DESC')) {
// ASC or DESC is invalid
return false;
}
}
return true;
}
Даже если предложение ORDER BY является сложным, оно все равно состоит только из значений, которые вы предоставляете (при условии, что вы не позволяете пользователям редактировать его вручную). Вы все еще можете проверить, используя белый список.
Я должен также добавить, что я обычно не люблю показывать структуру своей базы данных в URL-адресах или других местах пользовательского интерфейса, и часто буду использовать псевдоним в параметрах в URL-адресах и сопоставлять ее с реальными значениями, используя хэш.