SQLインジェクション攻撃は,Webアプリケーションを対象とした代表的な攻撃の一つであり,入力フォームなどに不正なSQL文を入力することで,データベースに対して想定外のSQL文を実行させる攻撃です。これにより,本来は閲覧できないデータを取得されたり,データを改ざんされたりする危険があります。
SQLインジェクション=入力データを悪用して不正なSQL文を実行させる攻撃
Webシステムでは,ユーザーが入力したデータをもとにSQL文を組み立ててデータベースにアクセスすることが多いため,入力値の扱い方によってはSQLインジェクションの脆弱性が発生する可能性があります。
このページでは,SQLインジェクション攻撃の仕組みを整理したうえで,プレースホルダーの利用を中心とした根本的な対策と,保険的な対策についてシンプルに解説します。
SQLインジェクション攻撃とは
SQLインジェクション攻撃とは,Webアプリケーションの入力フォームなどに不正なSQL文を入力して想定外のSQL文を実行させることにより,通常はアクセスが禁止されているデータにアクセスしたり,改ざんしたりする攻撃をいいます。
根本的な対策(入力値の安全化)
プレースホルダーを利用する
プレースホルダーとは,仮に確保した場所のことをいい,実際の内容は後から入れることができます。SQL文の場合,SQL文のひな形の中にプレースホルダーを置いて,そこに実際の値を機械的な処理で割り当てます。
※ SQL文が機械的に組み立てられるので,SQLインジェクションの脆弱性を解消できる
※ バインド…プレースホルダーに実際の値を割り当てる処理
SELECT * FROM 利用者マスタ WHERE name = ?;
※ ?をプレースホルダーとして使用
エスケープ処理を行うAPIを利用する(SQL文の組立てを文字列の連結により行う場合)
エスケープ処理とは,特別な意味をもつ文字(’ や ” など)を,ただの文字に変換する処理のことをいいます。データベースエンジンによっては,専用のAPIを提供しているものもありますので,(SQL文の組立てを文字列の連結により行う場合は)それを利用します。
※ 特別な意味をもつ文字を,ただの文字に変換することで,SQLインジェクションの脆弱性を解消できる
SELECT * FROM 利用者マスタ WHERE id = ‘ID’ AND pass = ‘パスワード’;
※ エスケープ処理をしていない場合,「ID」に「’ OR ‘1’=’1」,「パスワード」に適当な文字列を入力すると,パスワードによる認証をすり抜けることができる ⇒ 条件が常に真となり,すべてのデータを取得される ⇒ エスケープ処理により,「’ OR ‘1’=’1」を「\’ OR \’1\’=\’1」(\などを使用することが多い)のようにすることで,「’(シングルクォート)」本来の意味を無効化する
その他の対策(保険的な対策)
- エラーメッセージを,そのままの形でWebブラウザに表示しない
※ 攻撃の手がかりを与える可能性がある
- データベースに接続する際に使用するアカウントに適切な権限を与える
※ 必要最小限の権限を与え,被害の深刻化を防ぐ
まとめ
今回は,SQLインジェクション攻撃対策について,攻撃のしくみと,プレースホルダー(バインド機構)を利用した根本的な対策,および保険的な対策についてシンプルにまとめてみました。SQLインジェクションは,入力データを悪用して不正なSQL文を実行させる攻撃であり,Webアプリケーションにおいて特に注意が必要な脆弱性です。
理解が進んだら,基本情報技術者試験の過去問題にもチャレンジしてみてください。


