基本情報技術者 2018年 春期 午前(科目A) 問41
問題文
SQLインジェクション攻撃による被害を防ぐ方法はどれか。
選択肢
ア:入力された文字が、データベースへの問合せや操作において、特別な意味をもつ文字として解釈されないようにする。(正解)
イ:入力にHTMLタグが含まれていたら、HTMLタグとして解釈されない他の文字列に置き換える。
ウ:入力に上位ディレクトリを指定する文字列(../)が含まれているときは受け付けない。
エ:入力の全体の長さが制限を超えているときは受け付けない。
🔒 解説は解答すると表示されます
SQLインジェクション対策【午前解説】
正解の理由
正解は ア です。SQLインジェクションは、入力値がそのままSQL文の一部として解釈されることで発生します。入力中のシングルクォートやセミコロンなどを「ただのデータ」として扱うために、エスケープ処理あるいはより安全な方法としてパラメータ化(プレースホルダ、プリペアドステートメント)を用いれば、攻撃用のSQLが実行されなくなります。これにより、入力がデータベースの構文や命令へ影響を与えることを防げます。
解法ステップ
- 問題文から攻撃種類を特定する(ここではSQLインジェクション)。
- 各選択肢がどの攻撃・脅威に効くかを分類する(XSS、ディレクトリトラバーサル、入力検査など)。
- 「SQLの解釈」を直接変える選択肢を選ぶ。エスケープ/パラメータ化が該当する。
- 実運用面ではプリペアドステートメントやORMのパラメータ機能を優先し、手動の文字列連結は避ける。
選択肢別の誤答解説
- ア(正解): 入力をSQLの特別文字として解釈されないようにする、すなわちエスケープやプレースホルダによる対策で直接的に注入を防げます。
- イ: HTMLタグを無効化する対策はクロスサイトスクリプティング(XSS)向けで、サーバ側でのSQL実行の解釈を変えるわけではありません。
- ウ: "../" の拒否はファイルパス操作に対する対策(ディレクトリトラバーサル)で、SQL文の注入対策とは用途が異なります。
- エ: 入力長の制限は攻撃の送り付け量を抑える一助にはなりますが、短い入力でも有効なペイロードは存在するため根本対策にはなりません。
よくある誤解
- HTMLタグの無効化(イ)はXSS対策であり、SQLインジェクション防止には直接関係がありません。
- 上位ディレクトリ文字列の拒否(ウ)はディレクトリトラバーサル対策であり、SQL文の解釈とは別問題です。
- 長さ制限(エ)はバッファやDoSの軽減には役立ちますが、SQL構文そのものの注入を防ぐ手段にはなりません。
補足コラム
実務では「手動で文字列連結してクエリを作る」ことが最大のリスク源です。推奨される対策は以下です。
- パラメータ化(プレースホルダ)/プリペアドステートメントを使う(例:? や %s、$1)
- ORマッパー(ORM)の安全なクエリ機能を利用する
- 必要に応じてホワイトリストによる入力検証(列挙された値のみ許可)を併用する
- 最小権限のDBユーザ、ログおよび監査の実装
下はPythonでの簡単な例です(sqlite3)。プレースホルダを使って変数を渡せば安全です。
import sqlite3
conn = sqlite3.connect('example.db')
cur = conn.cursor()
# 悪い例(文字列連結は危険)
# sql = "SELECT * FROM users WHERE name = '" + user_input + "'"
# 良い例(パラメータ化)
sql = "SELECT * FROM users WHERE name = ?"
cur.execute(sql, (user_input,))
rows = cur.fetchall()
古い手法のmysql_real_escape_stringなどでエスケープしても正しく行われないケースやエンコーディング問題があるため、可能な限りプリペアドステートメントを優先してください。
FAQ
Q1: 入力の検証(正規表現)だけで十分ですか?
A1: 一部のケースで有効なホワイトリスト検証は効果的ですが、全文字列を安全に扱うにはパラメータ化を併用すべきです。
A1: 一部のケースで有効なホワイトリスト検証は効果的ですが、全文字列を安全に扱うにはパラメータ化を併用すべきです。
Q2: ストアドプロシージャは安全ですか?
A2: ストアドプロシージャ自体は有益ですが、内部で動的SQLを文字列連結していると脆弱になります。プロシージャ内でもパラメータ化を使ってください。
A2: ストアドプロシージャ自体は有益ですが、内部で動的SQLを文字列連結していると脆弱になります。プロシージャ内でもパラメータ化を使ってください。
Q3: 既存のコードベースが大量にある場合の対処は?
A3: 優先度を付けて影響範囲の大きい箇所からプレースホルダ化し、WebアプリのWAFやログ監視で補完するのが現実的です。
A3: 優先度を付けて影響範囲の大きい箇所からプレースホルダ化し、WebアプリのWAFやログ監視で補完するのが現実的です。
Q4: 長さ制限は無意味ですか?
A4: 全く無意味ではありませんが、攻撃を根本的に止めるものではないため、他の対策と併用してください。
A4: 全く無意味ではありませんが、攻撃を根本的に止めるものではないため、他の対策と併用してください。
関連キーワード: SQLインジェクション、入力検証、パラメータ化、プレースホルダ、エスケープ処理、プリペアドステートメント、ORM、ディレクトリトラバーサル、クロスサイトスクリプティング

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

