0

给定以下代码

 <?php
$values = array('Foo'  =>'Foo'  ,'Bar'  =>'Bar'  );
$separated = "'" . implode("','", $values)."'";
$sql = 'SELECT NAME,AGE FROM CATS WHERE TITLE IN('  .$separated.')'  ;

print_r($sql);

产生:

 SELECT NAME,AGE FROM CATS WHERE TITLE IN('Foo','Bar')

关于使用这种类型的查询构建器的 SQL 注入,我需要注意什么吗?如果是这样,可能发生的攻击是什么?

4

2 回答 2

2

SQL安全的唯一规则:

不应该直接将值添加到查询中,但只能通过占位符

因此,您必须使用支持占位符的库。

假设你的数据库是 mysql,最好的选择是safemysql,它会让你有这样简单的代码:

$sql  = 'SELECT NAME,AGE FROM CATS WHERE TITLE IN(?a)';
$data = $db->getArr($sql, $values);
print_r($data);

或者你可以使用PDO,但这会给你带来更多的麻烦

于 2013-09-04T12:50:45.670 回答
2

无论它们来自何处,都不应在查询中使用任何变量。PDO 和参数化查询的解决方案是将占位符添加到查询中。

我这样做是这样的:

function getPlaceholders ($array) {
  return !empty($array)
    ? implode(',', array_fill(0, count($array), '?'))
    : null;
}

$userIds = array(1,2,3,4);

$sql = 'SELECT FROM users WHERE id IN (' . $this->getPlaceholders($userIds) . ')';
$result = pdo_query($sql, $userIds);

通常,您会使用 OOP 格式。

$userIds = array(1,2,3,4);

$sql = 'SELECT FROM users WHERE id IN (' . $this->getPlaceholders($userIds) . ')';
$result = $this->db->query($sql, $userIds);


// common file which is extended
public function getPlaceholders ($array) {
  return !empty($array)
    ? implode(',', array_fill(0, count($array), '?'))
    : null;
}

这将生成如下查询:

SELECT FROM users WHERE id IN (?,?,?,?)
于 2013-09-04T13:17:41.713 回答