基本情報技術者試験など情報処理技術者試験を受験する方にとっては必須の,SQLインジェクション攻撃対策についてシンプルにまとめています。はじめに,SQLインジェクション攻撃の概要を説明し,その後,根本的な対策(プレースホルダーの利用(バインド機構),エスケープ処理を行うAPIの利用)と,その他,保険的な対策について説明しています。
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インジェクション攻撃対策について,シンプルにまとめてみました。


