サイバー攻撃手法・脆弱性分析 重要度:★★★出題: AM2・PM1
SQLインジェクション と プレースホルダ (プリペアドステートメント)
えすきゅーえるいんじぇくしょん / ぷれーすほるだ / SQL Injection & Parameterized Queries / Prepared Statements
利用者からの入力値を文字列連結してSQL文を組み立てる不備を突き、意図しないSQLコマンドを実行させてDBの不正閲覧・改ざんを行う攻撃と、その根本対策。
3行速習ポイント
- 根本対策は「プレースホルダ(パラメータ化クエリ / プリペアドステートメント)」の採用であり、SQL文の構文構造とデータ値を分離してバインドする
- 静的プレースホルダでは、先にSQL文の構文解析(コンパイル)が完了してからパラメータ値を代入するため、入力値によってSQLの論理構造が絶対に変化しない
- エラーメッセージを表示しない環境でも、応答の真偽差やSLEEP関数による応答遅延を利用した「ブラインドSQLインジェクション」が成立する
図解
図SQLインジェクションの根本対策と多層防御設計
1. 根本対策(必須)
根本対策:プレースホルダ(プリペアドステートメント)
SQL構文のコンパイル後にパラメータ値をバインド
SQL文の構造と入力データを完全に分離するため、シングルクォートや OR 1=1 等の文字列が入力されても単なるリテラル値として扱われSQL構造が変化しない
↕
2. 実装補完対策
動的識別子の保護:ホワイトリスト検証・型チェック
カラム名・ソート順などバインド不可箇所の許可リスト照合
プレースホルダが適用できない箇所では、入力値を直接連結せず、許可された固定文字列リストとの一致判定で置換する
↕
3. 被害局限化
影響緩和策:DB接続アカウントの最小権限化・エラー隠蔽
必要最小限のSELECT/UPDATE権限のみ付与し詳細エラーを非表示化
万一脆弱性が存在してもOSコマンド実行や別テーブル破壊、エラーメッセージからのDB構造推測(Error-based SQLi)を防止
💡 ORDER BY句のカラム名やテーブル名などプレースホルダが使えない動的識別子には、サーバ側での「ホワイトリスト完全一致検証」を適用する
概要と本質
Webアプリの最も代表的かつ致命的な脆弱性です。シングルクォートのエスケープ処理だけに頼ると、文字コードの解釈差や数値型パラメータ(クォートで囲まない箇所)で突破されることがあります。バインド機構(プレースホルダ)を用いることが絶対原則です。
重要ポイント・コア概念
- 識別子(テーブル名やカラム名、ORDER BY句のソート順)の動的指定:プレースホルダが使えない箇所では、入力値をそのまま埋め込まずサーバ側のホワイトリスト(許可リスト)と完全一致検証して置換する
- 最小権限の原則(影響緩和策):WebアプリがDBへ接続するアカウントには、DROP TABLEやシステムカタログ閲覧、OSファイル読書き権限を与えず、必要なテーブルへのSELECT/INSERT/UPDATEのみを許可
- セカンドオーダーSQLインジェクション:一度DBに正常保存された値が、別の管理画面等で取り出されて文字列連結SQLに使われた際に発火する攻撃
午後記述・情報セキュリティ対策での攻略ポイント
午後試験のソースコード診断問題で最頻出。「何行目にSQLi脆弱性があるか」「プレースホルダを使ってどのように修正するか」「プレースホルダが使えないORDER BY句のカラム名指定をどう安全に実装するか(ホワイトリスト判定)」が問われます。
午後記述で使える加点キーワード(クリックでコピー)
関連する重要用語
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着情報処理安全確保支援士 過去問演習で実践力を鍛える