46
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel の whereRaw は使っても良い

Posted at

【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]);

46
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
45

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?