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]);
この記事が気に入ったらサポートをしてみませんか?