SQLインジェクション

SQLインジェクション(SQL Injection)

SQLインジェクションとは、アプリケーションのセキュリティ不備を利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法です。

SQLに別のSQL文を「注入 (inject)」されることから、「ダイレクトSQLコマンドインジェクション」とも呼ばれます。


SQLインジェクション仕組み

ユーザー名とパスワードを入力してログインするシステムを例とします。


以下は、「uid」と「passwd」の組み合わせがデータベースのものと一致した場合に、当該ユーザの過去情報やログイン権限を取得するSQL文です。


SELECT * FROM user WHERE uid='$uid' AND passwd='$passwd' 

このSQL文に対して、パラメータを入力します。

「uid」には任意も文字列を入力して、「passwd」に「' OR 'A'='A」と入力します。

この結果、SQL文は以下のようになります。


SELECT * FROM user WHERE uid='test' AND passwd='' OR 'A'='A'

このSQL文が実行されると、ORの後の「'A'='A'」は常に真となる条件なので、結果的に以下のコマンドが実行されることと同じとなります。


SELECT * FROM user

つまり、パスワードが異なるにもかかわらずuserテーブルに関する全ての情報が不正に取得されてしまうという現象が発生します。


対策

バインド機構の使用

バインド機構とは、変数部分に変動個所(プレースホルダ)と呼ばれる特殊文字「?など」を使用してSQLのテンプレートを予め作成しておき、変動個所(プレースホルダ)に実際の値(バインド値)を割り当ててSQL文を生成するデータベースの機能です。

実行想定されるSQLコマンドを洗い出しておくことで、不正実行を防止します。


HTML入力フォームのエスケープ

入力フォームを経由する場合、メタキャラクタをエスケープ処理します。


サーバのエラーメッセージ対策

クライアントに対して詳細なエラーメッセージを送信しないように設定します。

エラーメッセージからの推測を脅威として認識する必要があります。


関連ページ