php - 即使使用准备好的语句,PDO 查询也会因某些输入而崩溃
问题描述
我的网站上有一个与 PHP PDO MySQL 连接的搜索功能。
为了计算分页的结果,我正在执行如下查询:
SELECT count(*) FROM articles WHERE (`title` LIKE ? OR MATCH(`text`) AGAINST(? IN BOOLEAN MODE)) AND `active` = 1
但是,似乎有人正在尝试 SQL 注入(我假设),输入如下搜索词:
1"'`--
这似乎最终完全打破了我的查询。它使用的是准备好的语句,正如您在 ? 中看到的那样,所以我不确定它为什么会导致此错误发生:
SQL 错误 SQLSTATE[42000]:语法错误或访问冲突:1064 语法错误,意外的“-”
什么都不做,通常的 PDO 东西像:
$this->stmt = $this->prepare($sql);
$this->stmt->execute($data_array);
数据通过按空格分隔来排序,以环绕通配符,如下所示:
$search_array = array(explode(" ", $search_text));
$search_through = '';
$search_sql_text = '';
foreach ($search_array[0] as $item)
{
$item = str_replace("%","\%", $item);
$search_through .= '%'.$item.'%';
}
完整的查询基本上是这样结束的:
SELECT count(*) FROM articles WHERE (`title` LIKE %1"'`--% OR MATCH(`text`) AGAINST("+1"'`--" IN BOOLEAN MODE)) AND `active` = 1
防止此类事情发生的最佳方法是什么?
解决方案
事实证明,这是 InnoDB 的一个问题,任何以运算符开头的输入即使使用准备好的语句,它也会将字符串输入作为运算符。最简单的选择是去掉运算符,因为文本搜索将正常工作。
推荐阅读
- r - 如何在 r 中使用带有 dplyr 的变异函数中的向量
- algorithm - F在排序数组中找到单个元素,其中每个元素出现两次,除了一个 | 数据结构和算法
- django - 一个模型在 Django 中有 2 个类别。如何在 html 中显示来自同一模型的另一个类别?
- django - Django 处理请求的性能缓慢
- indy - 如果我们在TIdHTTP中尝试以中文为参数执行GET需要什么特殊处理
- javascript - 在 Promise 的动态数组的情况下,如何知道 Promise.all 返回哪个变量
- python - 在 python 中为 Django 设置虚拟环境
- jenkins - Jenkins 脚本化管道 - 带有通配符的分支条件
- flutter - Dart , Flutter 我该如何克服这个错误?我想从地图中获取信息以在此处显示
- r - 比较 2 列或更多列并获取 r 中另一列中的匹配值