1

我正在构建一个脚本,用户可以在其中搜索数据库。我的理解是 PDO 不允许您为 LIKE 操作数设置参数。所以我有这个代码来弥补它

$sQuery = "SELECT * FROM table WHERE column LIKE '%" . $this->sQuery . "%' LIMIT 30";
$Statement = $this->Database->prepare($sQuery);
$Statement->execute();

我怀疑这对于 SQL 注入是安全的。有什么办法让它安全吗?

4

2 回答 2

1

你是对的,将任何值插入 SQL 字符串都会产生 SQL 注入漏洞的风险。最好在 时使用 SQL 查询参数占位符prepare(),然后在 时将值作为参数提供execute()

$pattern = "%" . $this->sQuery . "%";
$sQuery = "SELECT * FROM table WHERE column LIKE ? LIMIT 30";
$Statement = $this->Database->prepare($sQuery);
$Statement->execute(array($pattern));

把它当作伪代码,因为我不能从你的例子中看出你正在使用哪个 MySQL 扩展。我假设 PDO,它允许将参数作为数组参数发送到execute().

有些人使用PDOStatement::bindParam(),但这样做没有任何好处。也许在其他一些 RDBMS 品牌中是这样PDO::PARAM_STR,但在 MySQL 驱动程序中,参数类型被忽略了。

PS:除了您询问的安全问题之外,您会发现像您正在做的基于通配符的模式的搜索随着数据的增长而表现不佳。请参阅我的演示文稿全文搜索Throwdown

于 2013-02-10T16:22:53.177 回答
0

这应该有效:

$sQuery    = "SELECT * FROM table WHERE column LIKE :query LIMIT 30";
$Statement = $this->Database->prepare($sQuery);
$Statement->execute(array(':query' => '%' . $this->sQuery . '%'));
于 2013-02-10T16:23:09.643 回答