如何清理客户端查询到 laravel 中的 whereFullText 雄辩方法

问题描述 投票:0回答:1

enter image description here我在 Laravel 中遇到了

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 laravel eloquent full-text-search sql-injection
1个回答
0
投票

MySql 的全文搜索有 几个字符作为操作符,因此

+
-
*
有特殊含义。我建议在将字符串传递给查询之前对其进行清理。我删除了除字母数字字符之外的所有内容并将其替换为空格,然后稍微调整以删除多余的空格:

$q = preg_replace('/[^a-z\d]+/i', ' ', $q);
$q = preg_replace('/\s+/', ' ', $q);
$q = trim($q);

如果您想确保每个单词都存在,请将空格替换为空格并加:

$q = '+' . str_replace(' ', ' +', $q);
© www.soinside.com 2019 - 2024. All rights reserved.