【whereRawは使わない】Laravelで複数条件をする方法【既出】
この記事をみて、ちょっと気になったので。
結論から言うと DB::whereRaw()
であっても、第2引数の $bindings を使えば言及されているようなSQLインジェクション問題は起きません。
言及されている問題のある書き方
リンク先のコード
$user = Input::get("user");
$password = Input::get("password");//ハッシュ化するものとするが例なので省略
User::whereRaw("user = '" . $user . "AND password = '".$password."'");
正しい DB:: whereRaw() の書き方
php
$user = Input::get("user");
$password = Input::get("password");//ハッシュ化するものとするが例なので省略
User::whereRaw('user = :user and password = :password', ['user' => $user,'password' => $password]);
// または
User::whereRaw('user = :user',['user' => $user])->whereRaw('password = :password',['password' => $password]);
確かにあげられているケースであればリンク先に書かれているように「DB::where()
を2回使う」という対応がシンプルで正しいけれど、Laravel から利用できないデータベース側の関数を使いたい場合などには自分で頑張ってエスケープして DB::raw()
を使うよりも、DB::whereRaw()
を正しく使う事でエスケープを Laravel 側に任せるほうが安全。
こんな感じ
DB::table('posts')->whereRaw('YEARWEEK(:postDate,1) = YEARWEEK(created_time,1)',['postDate' => $postDate]);