Laravel DB::raw 防止 SQL 没有 setBindings 的注入

Laravel DB::raw prevent SQL Injection without setBindings

我有一个用于过滤的动态查询,现在我遇到了一个问题,我需要使用 DB::raw 按

进行排序
$this->query->orderBy(\DB::raw("POSITION(\"$value\" IN $column)", 'asc'))

但现在我有一个 SQL 注入保护问题,我如何在不使用 ->setBindings[ 的情况下防止 $value$column 来自 SQL 注入=18=]

我不能使用 ->setBindings 因为我有动态数量的过滤列,具体取决于 table

您可以使用 orderByRaw 来接受绑定数组。

$this->query->orderByRaw('POSITION(? IN ?) asc', [$value, $column]);

准备好的语句无法评估列名,因此您需要使用白名单来防止注入 $column.

为了防止值,您可以强制它是整数或浮点类型,或者使用接受参数数组的 orderByRaw:

$this->query->orderByRaw("POSITION(? IN $column)", [$value])

试试下面的方法,

$orderByQuery = "select * from table order by POSITION(:value IN :column) asc";
$this->query->select($orderByQuery, [
    "value" => $value,
    "column" => $column
])