SQLインジェクションとは
アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。
例えば以下のようなusers
テーブルがあるとする。
ID | password |
---|---|
ito | ito |
sato | sato |
kimura | kimura |
motomura | motomura |
SELECT * FROM users WHERE ID = '{$userId}' AND password = '{$passwd}'
上記SQLによりusers
テーブルでのレコードの存在が確認できればログインができるものとする。
ここで、悪意あるユーザー「sato」が、別ID「kimura」のパスワードを書き換え、不正にログインを試みようとする。
$userId
「kimura」
$passwd
「' OR 'A' = 'A」
結果、以下のSQLが生成される。
SELECT * FROM users WHERE ID = 'kimura' AND password = '' OR 'A' = 'A'
上記のように常にパスワードが真となるSQLが生成され、不正ログインを許容することになる。
このように、何かしらの処理で生成されるSQLを悪用し、不正ログインを行ったりDB内容を書き換えたりすることをSQLインジェクションという。
対策
- サーバーでの対策:エスケープ処理の実装でSQL文を成立させない、入力文字の種類や数に制限をかける
- ネットワークでの対策:ファイアウォールの導入など、脆弱性を狙った攻撃を検知するソリューションを導入する
- 実装時の対策:エスケープ構文を使用して特殊文字をエスケープする、クエリ内でLIMIT句やその他のSQL制御を使用することで、SQL
インジェクション攻撃が発生した場合のレコードの大量漏洩を防ぐ、など。
参考:https://www.owasp.org/images/2/23/OWASP_Top_10-2017%28ja%29.pdf
※ ちなみにruby_on_rails
では、特殊なSQL文字をフィルタする仕組みがビルドインで備わっている。その他対策は下記参照。
https://railsguides.jp/security.html#%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3