搜索选项的SQL连接的替代方法?

时间:2014-10-02 05:13:40

标签: php sql-server stored-procedures concatenation sql-injection

我是一名新手程序员,我已经继承了一个由现在离开公司的人设计和构建的应用程序。它是在PHP和SQL Server 2008R2中完成的。在这个应用程序中,有一个页面,其中有一个表格,显示从数据库中填充的项目列表,以及侧栏中过滤器的一些选项 - 按ID,关键字,日期等搜索。此表由一个庞大的查询填充,并通过将它们连接到所述查询中来应用过滤器。例如,如果有人想要项目#131:

$filterString = "Item.itemID = 131";
$filter = " AND " . $filterString;

SELECT ...
FROM ...
WHERE...
$filter

过滤器包含在搜索页面的URL末尾。这并不是很好,我相当确定会有一些SQL注入漏洞,但它非常灵活 - 过滤器字符串是在它连接之前创建的,并且可以有很多不同的条件:例如$ filterString可以是"条件AND条件和coindtion OR条件"。

我一直在研究存储过程,作为解决SQL注入问题的更好方法,但我还没有运气如何复制同样的灵活性。我没有提前知道将选择哪个过滤器(如果有的话)。

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:2)

使用支持准备/参数化查询的Mysqli或PDO来对抗sql注入。在PDO中,这可能看起来像这样

$conditions = '';
$params = array();

if(isset($form->age)) {
  $conditions .= ' AND user.age > ?'
  $params[] = $form->age;
}

if(isset($form->brand)) {
  $conditions .= ' AND car.brand = ?'
  $params[] = $form->brand;
}

$sql = "
  SELECT ...
  FROM ...
  LEFT ...
  WHERE $conditions
  ";

$sth = $dbh->prepare($sql);
$sth->execute($params);

$result = $sth->fetchAll();

从手册:

  

为将使用不同参数值多次发出的语句调用PDO :: prepare()和PDOStatement :: execute()通过允许驱动程序协商客户端和/或服务器端缓存来优化应用程序的性能查询计划和元信息,并通过消除手动引用参数的需要,有助于防止SQL注入攻击。

http://no1.php.net/manual/en/pdo.prepare.php