2016-11-30 96 views
0

以下代碼對SQL注入安全嗎?是OrderByRaw()安全嗎?

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

回答

1

號顧名思義,它插入一個原始表達。也就是說,沒有被動詞化。

如果你想排序的查詢,只是排序當需要查詢字符串參數(S)提供:

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

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

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

好的,如果我把反斜槓上面的變量括起來,應該沒問題吧? – daninthemix

+0

不一定。如果某人提交了諸如「鑰匙」之類的東西,該怎麼辦? DROP TABLE \'用戶\'; --'? –

0

與RAW查詢的問題是在綁定更多(用戶數據)比在sql查詢本身,這就是爲什麼你應該避免它們。但它是安全的,如果你單獨添加綁定:

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

我很想避免它們,但我不相信你可以通過ISNULL命令沒有:o/ – daninthemix

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(); 
+0

我仍然需要一個原始的Order By,因爲我想使用ISNULL來排除空值。 – daninthemix