基本情報 平成30年度 秋期 問41:テクノロジ系に関する問題
SQLインジェクション攻撃による被害を防ぐ方法はどれか。
- a入力された文字が, データベースへの問合せや操作において, 特別な意味をも つ文字として解釈されないようにする。正答
- b入力に HTML タグが含まれていたら, HTML タグとして解釈されない他の文字 列に置き換える。
- c入力に上位ディレクトリを指定する文字列 (../ ) が含まれているときは受け付 けない。
- d入力の全体の長さが制限を超えているときは受け付けない。
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは a です。
SQLインジェクションは、入力欄に「悪意のある命令文」を仕込んで、データベースを不正操作する攻撃です。例えば検索欄に変な記号を入れて、本来見せないデータを盗まれる感じ。
防ぎ方は「入れられた文字を“命令”として読まないようにする」こと。お店で「お名前」を聞かれた時、`'); 全データ消して --` と書いても、ちゃんと「人の名前」として処理してくれれば安全、というイメージ。
👉 覚え方:入力を“命令”じゃなく“ただの文字”として扱う。
ほかの選択肢:b はXSS対策/c はパストラバーサル対策/d は単なる長さ制限。
なぜこれが正解か
正解は a。SQLインジェクションは、ユーザ入力中の `'`, `;`, `--`, `OR 1=1` 等の特殊文字を含む文字列をSQL文の一部として実行させる攻撃。対策の本質は入力文字を特別な意味として解釈させないこと。具体的にはプレースホルダ(プリペアドステートメント)でSQL構文とデータを分離し、エスケープを自動化する。
各選択肢の解説
- b:HTMLタグのエスケープはXSS(クロスサイトスクリプティング)対策。
- c:`../` のチェックはパストラバーサル(ディレクトリトラバーサル)対策。
- d:入力長制限は補助的なバリデーションだが、SQLインジェクション本質対策ではない。
覚え方・ひっかけ注意
「入力を文字列として扱う=バインド変数/プレースホルダ」がキーワード。各選択肢は別種の脆弱性対策と1対1で対応する(a:SQLi/b:XSS/c:パストラバーサル/d:DoS緩和)と整理すれば暗記不要。
理論的背景
SQLインジェクションはOWASP Top 10で長年常連の脆弱性(最新版ではInjectionカテゴリに統合)。攻撃手法は①インバンド型(UNION SELECT、エラーベース)②ブラインド型(Boolean/Time-based)③アウトオブバンド型(DNS/HTTP外部送信)に分類。最近はSecond-Order Injection(DB保存後、別経路で実行される)も注目される。
対策の実装
- プリペアドステートメント/パラメータ化クエリ:JDBC `PreparedStatement`、PHP PDO `prepare()/execute()`、Python `cursor.execute(sql, params)`。最も確実。
- ORM:SQLAlchemy、ActiveRecord、Entity Frameworkは自動的にパラメータ化。ただし生SQL断片を渡すと無効化される。
- 入力検証:ホワイトリスト方式(許可文字のみ通す)。ブラックリスト(特殊文字除去)は迂回容易で非推奨。
- 最小権限:DBユーザに不要なDROP/CREATE権限を与えない。
- WAF:ModSecurity、AWS WAFのSQLi rule set。多層防御の一翼。
- エスケープ関数の単独使用は危険:文字コードや方言差で迂回される(例:`mysql_real_escape_string` のShift_JIS問題)。
試験での位置づけ
基本情報のセキュリティ分野で毎期必出級。応用情報・情報処理安全確保支援士では具体的なSQL文例(`' OR '1'='1` 等)や対策コード、CWE-89分類まで踏み込む。
選択肢の発展補足
XSS対策はコンテキスト別エスケープ(HTML/JS/CSS/URLそれぞれ)+Content Security Policy。パストラバーサルはファイル名正規化+chroot/ jail。SQLi対策と混同せず、それぞれ独立した防御層を組むのがセキュアコーディングの基本。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成30年度 秋期 問41/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。