【问题标题】:PHP PDO issue with sanitised ORDER BY fieldsPHP PDO 问题与净化的 ORDER BY 字段
【发布时间】:2012-10-21 15:36:18
【问题描述】:

我有一个“ajax 脚本/处理程序”,它将一堆产品类别返回到我的 jqGrid。 sql 最终看起来像这样:

$sql = 'SELECT * FROM product_categories ORDER BY :sidx :sord LIMIT :start , :limit';
$sth = $dbh->prepare($sql);
$sth->bindParam(':sidx', $sidx);
$sth->bindParam(':sord', $sord);
$sth->bindParam(':start', $start, PDO::PARAM_INT);
$sth->bindParam(':limit', $limit, PDO::PARAM_INT);
$sth->execute();

现在,我已经遇到了 '$start' 的问题,因为 PDO 显然有 LIMIT 的问题,所以我必须明确地将其设置为 (int) 以便上述方法可以工作。我的下一个问题是 ORDER BY 字段被引用。如何停止报价?我可以直接传递 '$sidx' 和 '$sord' 值而不对其进行清理,但这会很危险。 现在,上面的 SQL 生成为:

SELECT * FROM product_categories ORDER BY 'product_category' 'asc' LIMIT 0 , 10

当我真正需要它时:

SELECT * FROM product_categories ORDER BY product_category asc LIMIT 0 , 10

【问题讨论】:

  • 您是否让用户能够按列和方向输入自己的订单??
  • jqGrid 向上述脚本处理程序发送列顺序字段和方向,例如:script.php?_search=false&nd=1350834280848&rows=10&page=1&sidx=product_category&sord=desc 表示脚本将按 product_category 字段排序下降方向
  • 我见过 Alex,但它没有帮助。第一个答案告诉您不能绑定列名;但是我将如何清理变量?第二个答案告诉您直接使用变量,但在我的情况下,那很危险。我需要手动清理 $sidx 和 $sord 并直接在 $sql 中使用它们 - 但是,如何“手动”清理?加斜线够吗?
  • 只是做了一些研究并添加了斜杠 ISNT 不够;所以需要以其他方式手动对其进行消毒吗? mysql_real_escape_string 仅适用于其前面的有效 mysql_connect;并且手动 pdo::quote() 无论如何都会添加引号,所以这也无济于事!

标签: php jqgrid pdo


【解决方案1】:

也许最好的解决方案是直接传递$sidx$sord 值而不对其进行清理,但之前进行验证。喜欢:

$sidx = (!in_array($sidx,array('name','slug','description'))) ? 'name' : $sidx;
$sord = (!in_array($sord,array('asc','desc'))) ? 'asc' : $sord;
$sql = 'SELECT * FROM product_categories ORDER BY '.$sidx.' '.$sord.' LIMIT :start , :limit';
$sth = $dbh->prepare($sql);
$sth->bindParam(':start', $start, PDO::PARAM_INT);
$sth->bindParam(':limit', $limit, PDO::PARAM_INT);
$sth->execute();

【讨论】:

  • 这可能是一个解决方案,是的,但是因为我在许多数据库表上都使用了这个“代码模板”;每次都进行此设置需要做更多的工作。我不明白为什么 PDO 不只是一个普通的 mysql_real_escape_string 类型函数!我开始希望我坚持使用 MySQLi!
  • mysql_real_escape_string() 不用于这些目的。如果我通过 sidxname ASC; DROP TABLE product_categories; mysql_real_escape_string() 不会保护您的查询。如果你在控制结构中使用变量,你应该像上面一样检查它们。如果您能找到任何其他解决方案,请告诉我
  • 谢谢,我必须这样做,直到有更好的事情出现——如果有的话:)
猜你喜欢
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2015-09-16
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多