情報セキュリティ

基本情報技術者試験SQLインジェクション」の問題

情報セキュリティ情報セキュリティ難易度:hard
M社の会員検索機能で、利用者の入力した会員名をSQL文に直接連結して問合せを実行している。診断で『名前欄に特殊な文字列を入れると本来見えないはずの会員情報が返る』脆弱性が指摘された。アプリ側で講じる根本対策として、最も適切なものはどれか。
値をバインド機構で受け渡し、構文部分と切り離して問合せを組み立てる。
危険な記号を含む入力を拒否する禁止文字リストをあらかじめ設けて事前に弾く。
問合せに用いるDB接続アカウントの権限を参照専用に絞り込む。
検索結果を返す前に件数の上限を設け、一度に返る行数を抑える。
正解
値をバインド機構で受け渡し、構文部分と切り離して問合せを組み立てる。

脆弱性の原因は『入力値をSQL文へ直接連結している』点にある。値をバインド機構(プレースホルダ)に渡して構文部分と切り離して問合せを組み立てると、入力値はあくまでデータとして扱われ、入力に紛れ込ませた命令が構文として解釈されないため、SQLインジェクションを根本から無効化できる。

?選択肢ごとの解説

ア ○脆弱性の原因は『入力値をSQL文へ直接連結している』点にある。値をバインド機構(プレースホルダ)に渡して構文部分と切り離して問合せを組み立てると、入力値はあくまでデータとして扱われ、入力に紛れ込ませた命令が構文として解釈されないため、SQLインジェクションを根本から無効化できる。
イ ×禁止文字リストによる拒否は列挙漏れやエンコードによる回避が起きやすく、許可した文字の組合せで成立する注入を取りこぼす。
ウ ×接続アカウントを参照専用にしても、参照系の注入で会員情報を読み出される経路は残り、連結実装に起因する注入自体は解消しない。
エ ×返却行数の上限は一度に漏れる量を抑えるだけで、注入された問合せがDB内で実行される事実は変わらず脆弱性は残存する。

くわしく

SQLインジェクションは『データと命令の混同』が本質である。エスケープ処理も一手だが漏れが生じやすく、バインド機構による構文と値の構造的分離が最も確実とされる。入力検証や権限最小化は補助策として併用する。

本番での押さえどころ

試験のコツ

SQLインジェクションの根本対策はバインド機構による値と構文の分離。エスケープや禁止文字リストは補助と整理する。

覚え方

『データは箱に入れて渡す』。値を箱(プレースホルダ)に入れれば命令として読まれない。

よくある誤り

禁止文字リストや権限制限で防げると考えがちだが、列挙漏れや参照系の注入で抜けるため、構文分離でなければ根本解決にならない。

情報セキュリティの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-sec-0013

【基本情報技術者試験】SQLインジェクションの問題 — 解答・解説|ukamiru 過去問