基本情報技術者 2013年 春期 午前(科目A) 問40
問題文
SQLインジェクション攻撃を防ぐ方法はどれか。
選択肢
ア:入力中の文字がデータベースへの問合せや操作において、特別な意味をもつ文字として解釈されないようにする。(正解)
イ:入力にHTMLタグが含まれていたら、HTMLタグとして解釈されない他の文字列に置き換える。
ウ:入力に、上位ディレクトリを指定する文字列(../)を含むときは受け付けない。
エ:入力の全体の長さが制限を超えているときは受け付けない。
🔒 解説は解答すると表示されます
SQLインジェクション対策【午前解説】
正解の理由
選択肢ア「入力中の文字がデータベースへの問合せや操作において、特別な意味をもつ文字として解釈されないようにする。」が正解です。SQLインジェクションは攻撃者が入力欄にSQL構文要素(例:" OR '1'='1)を入れることで、本来意図したSQL文の構造を崩し不正な操作を行わせる攻撃です。プレースホルダ(パラメタライズドクエリ)や適切なエスケープにより入力を「データ」に固定し、SQLエンジンがそれを構文として解釈しないようにすれば注入は無効になります。
解法ステップ
- 問題文から攻撃種類を特定する(「SQLインジェクション」)。
- 各選択肢がその攻撃に対して直接的な防御策かを検討する(SQL構文の解釈を止めるか)。
- SQLインジェクションを防ぐ代表的手法(プレースホルダ、プリペアドステートメント、エスケープ)に当てはまる選択肢を選ぶ。
- 残りの選択肢(HTMLエスケープ、パス制限、長さ制限)は別の攻撃や補助対策であることを理由に排除する。
選択肢別の誤答解説
- ア: 正解。入力がSQLの特別文字として解釈されないようにし、プレースホルダ等でデータと構文を分離する対策を指します。
- イ: HTMLタグを別の文字列に置換するのはXSS(クロスサイトスクリプティング)対策であり、SQLインジェクションの防止には直接寄与しません。用途が異なります。
- ウ: 上位ディレクトリ参照(../)の拒否はディレクトリトラバーサル対策であり、SQL文の注入を防ぐ方法ではありません。
- エ: 入力長の制限はバッファオーバーフローや極端な長入力の抑制に有効な場合がありますが、短いペイロードでもSQL注入は可能なため根本対策になりません。
よくある誤解
- HTMLエスケープとSQLエスケープを混同する:HTMLエスケープはXSS対策であり、SQLインジェクション防止には直接効果がありません。
- 長さ制限で防げると考える:入力長を制限しても悪意ある短いペイロードで注入できる場合があり根本対策になりません。
- エスケープだけで完全に安心と思う:データベースや文字エンコーディング次第で抜け穴が生じるため、パラメタライズドクエリを優先すべきです。
補足コラム
実務では次の組み合わせが推奨されます:パラメタライズドクエリ(プレースホルダ)を第一選択、次いで入力検証(ホワイトリスト)・最小権限のDBアカウント・適切なエスケープ・監査ログ・WAF(Web Application Firewall)を導入します。特にプレースホルダは言語・DBドライバが提供する機能を使えば、文字エンコーディングの違いによる抜け穴を防ぎやすく実装も簡単です。
コード例(Python:sqlite3 のパラメタライズドクエリ)
import sqlite3
conn = sqlite3.connect("example.db")
cur = conn.cursor()
# 危険な文字列連結はしない
user_input = "some_user"
cur.execute("SELECT * FROM users WHERE username = ?", (user_input,))
rows = cur.fetchall()
conn.close()
PHP(PDO)例
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute([':username' => $user_input]);
$rows = $stmt->fetchAll();
FAQ
Q: SQLエスケープだけで十分ですか?
A: エスケープは有用ですが、DBや文字コードの違いで誤りが生じる可能性があるため、可能な限りパラメタライズドクエリを優先してください。
A: エスケープは有用ですが、DBや文字コードの違いで誤りが生じる可能性があるため、可能な限りパラメタライズドクエリを優先してください。
Q: HTMLエスケープはSQLインジェクションに効果がありますか?
A: いいえ。HTMLエスケープはブラウザでの表示に関するもので、SQL文の解釈とは無関係です。両方の対策を用途に応じて使い分けてください。
A: いいえ。HTMLエスケープはブラウザでの表示に関するもので、SQL文の解釈とは無関係です。両方の対策を用途に応じて使い分けてください。
Q: 入力長の制限だけで本当に安全になりますか?
A: いいえ。長さ制限は補助的対策であり、根本的な防止策ではありません。短い攻撃文字列でも注入が可能です。
A: いいえ。長さ制限は補助的対策であり、根本的な防止策ではありません。短い攻撃文字列でも注入が可能です。
関連キーワード: SQLインジェクション、防御策、パラメタライズドクエリ、プレースホルダ、入力検証、エスケープ、プリペアドステートメント、最小権限、WAF、コーディングベストプラクティス

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

