whereFullText
的问题。这是我的代码:
$search_key = $args['q'] ?? $args['search_key'] ?? NULL;
$builder->when($search_key, function (Builder $builder, $search_key) {
$builder->whereFullText(self::fullTextColumns(), $search_key . self::WILDCARD, [
'mode' => 'boolean', // [ natural, natural language, query expansion, boolean ]
]);
});
当客户端发送包含像
search_key
这样的恶意负载的 "asd--"
时,我的 SQL 查询的其余部分将被注释掉。此漏洞使其容易遭受 SQL 注入。有什么办法可以处理这个问题吗?
仅当模式为“布尔”时才会出现此问题。其他模式按预期工作!!
MySql 的全文搜索有 几个字符作为操作符,因此
+
、-
、*
有特殊含义。我建议在将字符串传递给查询之前对其进行清理。我删除了除字母数字字符之外的所有内容并将其替换为空格,然后稍微调整以删除多余的空格:
$q = preg_replace('/[^a-z\d]+/i', ' ', $q);
$q = preg_replace('/\s+/', ' ', $q);
$q = trim($q);
如果您想确保每个单词都存在,请将空格替换为空格并加:
$q = '+' . str_replace(' ', ' +', $q);