是的,SQL注入攻击可以使用未转义的ORDER BY子句作为向量.这里解释了如何利用这一点,以及如何避免此问题:
http://josephkeeler.com/2009/05/php-security-sql-injection-in-order-by/个
这篇博文建议使用白名单来验证ORDER BY参数,这几乎肯定是最安全的方法.
要响应更新,即使该子句很复杂,也可以编写一个 routine ,根据白名单对其进行验证,例如:
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或UI中的其他位置公开我的数据库 struct ,并且通常会给URL中的参数中的内容加上别名,并使用散列将其映射到实际值.