以下代码是否可以安全地从SQL注入?
if ($request->has('sort')) {
$s = $request->sort;
if ($request->has('asc')) {
$a = $request->asc;
} else {
$a = 'asc';
}
$query->orderByRaw("ISNULL({$s}), {$s} " . $a);
}
答案 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();