見出し画像

Laravel学習記録 #031 SQLインジェクション対策を学ぶ

LaravelでのCSRF対策について学習したものをまとめています。

SQLインジェクションについて

  • SQL文の組み立てに問題がある場合に起こる可能性がある

  • 悪意のあるユーザーにデータベースを不正利用されてしまう

  • データの盗み出し、データベースの変更など被害はさまざま

ざっくり攻撃の流れ

① 攻撃者がウェブアプリケーションの入力フォームやURLパラメータに不正なSQLクエリを入れます。
② SQLインジェクションが成功すると、不正なSQLクエリがデータベースに送信されます。
③ サーバーは攻撃者によって意図されたアクションを実行します。
④ 攻撃者によってデータベース内の機密情報を盗み出す、データを改ざんなどが行われます。

対策

SQL 対策には「SQL文の組み立ては全てプレースホルダで実装する」という方法で対応します。

LaravelでのDB操作には
・Eloquent ORM
・クエリビルダ
・直接SQL実行
の方法があります。
Eloquent ORMやクエリビルダを使用してデータベースにアクセスする場合は、自動的にSQLインジェクションを防ぐためのエスケープをしてくれます。
直接SQL実行の場合は自身でプレースホルダを設定します。

それぞれのケース例

Eloquent ORM

$users = User::where('loginId', $loginId)
              ->where('active', 1)->get();

クエリビルダ

$users = DB::table('users')
             ->where('loginId', $loginId)
             ->where('active', 1)->get();

直接SQLを実行

// パラメータバインディング
$users = DB::select('select * from users where active = ? and loginId = ?', [1, $loginId]);

// 名前付きバインディング
$users = DB::select('select * from users where active = :active and loginId = :loginId', ['active' => 1, 'loginId' => $loginId]);

この記事が気に入ったらサポートをしてみませんか?