我是一名新手程序员,我已经继承了一个由现在离开公司的人设计和构建的应用程序。它是在PHP和SQL Server 2008R2中完成的。在这个应用程序中,有一个页面,其中有一个表格,显示从数据库中填充的项目列表,以及侧栏中过滤器的一些选项 - 按ID,关键字,日期等搜索。此表由一个庞大的查询填充,并通过将它们连接到所述查询中来应用过滤器。例如,如果有人想要项目#131:
$filterString = "Item.itemID = 131";
$filter = " AND " . $filterString;
SELECT ...
FROM ...
WHERE...
$filter
过滤器包含在搜索页面的URL末尾。这并不是很好,我相当确定会有一些SQL注入漏洞,但它非常灵活 - 过滤器字符串是在它连接之前创建的,并且可以有很多不同的条件:例如$ filterString可以是"条件AND条件和coindtion OR条件"。
我一直在研究存储过程,作为解决SQL注入问题的更好方法,但我还没有运气如何复制同样的灵活性。我没有提前知道将选择哪个过滤器(如果有的话)。
我有什么遗失的吗?
答案 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注入攻击。