SQLインジェクション
出典: フリー百科事典『ウィキペディア(Wikipedia)』
SQLインジェクションとは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。また、その攻撃を可能とする脆弱性のこと。
SQLに別のSQL文を「注入 (inject)」されることから、「ダイレクトSQLコマンドインジェクション」とも呼ばれる。
目次 |
[編集] 原理
アプリケーションが入力値を適切にエスケープしないままSQL中に展開することで発生する。
次のようなSQLを発行することを考える。
SELECT * FROM users WHERE name = '(入力値)';
ここで入力値に "' OR 't' = 't
" という文字列を与えた場合を考えると、SQL文は次のように展開される。
SELECT * FROM users WHERE name = '' OR 't' = 't';
このSQL文では条件が常に真となるため、nameカラムの値にかかわらず、全レコードが選択される。
また、複数のSQL文を注入することによるデータの破壊や改竄、ストアードプロシージャを実行されることによる情報の漏洩や改竄、OSコマンドの実行などを引き起こすこともできる場合がある。
[編集] 対策
入力値を適切にエスケープすることで防ぐことができる。上述の文字列中への展開では、メタ文字 '
を ''
にエスケープすることにより、次のようなSQLになり、意図されたとおりnameカラムが "' OR 't' = 't
" という値を持つレコードが選択される。
SELECT * FROM users WHERE name = ''' OR ''t'' = ''t';
文字列リテラル以外では適切なエスケープ法がSQL標準に定義されていないので、ホワイトリスト(許可リスト)方式による入力値の検証を行うことで代用とする。
データベースシステムやライブラリによっては、準備された文 (prepared statement) を用いてエスケープ処理が自動化されており、対策もれを防ぐ上で有益である。
[編集] 実例
- 2005年5月に発生した、価格.comのWebサイトへの改竄攻撃事件でのシステム侵入者の攻撃方法は、このSQLインジェクションによるものであると言われている。
- 2005年11月に発生した、「ワコールオンラインショップ」個人情報漏洩の手口はSQLインジェクションである。
[編集] 関連項目
[編集] 外部リンク
- IPAセキュリティセンター セキュア・プログラミング講座 - 第2章 セキュアデータベースプログラミング
- @IT Security&Trust - Webアプリケーションに潜むセキュリティホール 第2回 顧客データがすべて盗まれる?!
カテゴリ: コンピュータ関連のスタブ項目 | インターネットセキュリティ | データベース | SQL