OrderByRaw()安全吗?

时间:2016-11-30 14:43:33

标签: laravel eloquent

以下代码是否可以安全地从SQL注入?

    if ($request->has('sort')) {
        $s = $request->sort;
        if ($request->has('asc')) {
            $a = $request->asc;
        } else {
            $a = 'asc';
        }
        $query->orderByRaw("ISNULL({$s}), {$s} " . $a);
    }

3 个答案:

答案 0 :(得分:1)

没有。顾名思义,它会插入一个 raw 表达式。也就是说,没有资格。

如果您想要对查询进行排序,只需在提供require查询字符串参数时进行排序:

if ($sort = $request->query('sort')) {
    $direction = $request->query('direction');

    if (! in_array($direction, ['asc', 'desc'])) {
        $direction = 'asc'; // default direction
    }

    $query->orderBy($sort, $direction);
}

答案 1 :(得分:0)

RAW查询的问题在于绑定(用户数据)比在sql查询本身中更多,这就是为什么你应该避免它们。但是如果你单独添加绑定会更安全:

public function orderByRaw($sql, $bindings = []) {...}

答案 2 :(得分:0)

有一种更好的方法可以使用when来实现这种条件查询,例如:

// You have the $query instance already...
$sort = $request->get('sort');

$query->when($sort, function($query) use($request) {
    $order = $request->asc ?: 'asc';
    return $query->orderBy($sort, $order);
});

现在,orderBy仅在$sort可用时才会应用,您可以进一步添加更多查询约束并执行它:

// $query->where(...);

$result = $query->get();