2016-11-30 11 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

号名前が示唆するように、発現を挿入します。つまり、非衛生的です。クエリ文字列パラメータ(複数可)を必要とちょうどソート

クエリを並べ替えしたいしている場合は、提供されています

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

必ずしもそうではありません。誰かが 'key \'のようなものを提出するとどうなりますか? DROP TABLE \ 'users \'; - '? –

0

RAWクエリに問題があるバインディングではるか(ユーザデータ) SQLクエリ自体よりも、それを避ける必要があります。

// 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はします:

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

私はそれらを避けたいですが、ISNULLなしで注文できるとは思いません:o/ – daninthemix

0

は、例えばwhenを使用して条件付きクエリのこの種を達成するためのより良い方法があります:あなたが個別にバインディングを追加した場合しかし、それは安全です$sortが利用可能な場合にのみ適用し、さらにクエリの制約をさらに追加して、次のように実行できます。

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

$result = $query->get(); 
+0

ISNULLを使用してヌル値を除外したいので、未処理のOrder Byが必要です。 – daninthemix

関連する問題