SQL Injectionとは?
->アプリケーションが想定しないSQL文を実行させること
公式: https://readouble.com/laravel/6.x/ja/queries.html
rawメソッドはクエリを文字列として挿入するため、SQLインジェクションの脆弱性を生まないように十分気をつけてください。
DB::rawメソッド使用時にはエスケープされない。
1 | User::where(DB::raw( 'CONCAT(last_name, first_name)' ), 'like' , '%' . $text . '%' )->get(); |
mysqlのlike演算子では、% と _ 特別な意味を持つが、DB::rawではエスケープされないので、$textに’%’や’_’が入っていた場合など、SQLインジェクションの脆弱性を生む。
$textの値は、¥%、¥¥、¥_と言うようにエスケープしないといけない。
以下のような使い方の場合は問題なしか。
1 | User::select(DB::Raw( 'concat(last_name, first_name) as name' ), 'id' ) |