LoginSignup
1
2

More than 5 years have passed since last update.

SQLインジェクションとは

Last updated at Posted at 2018-08-29

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

1
2
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
1
2