你是对的,将任何值插入 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。