戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2018年 春期 午前(科目A)41


問題文

SQLインジェクション攻撃による被害を防ぐ方法はどれか。

選択肢

入力された文字が、データベースへの問合せや操作において、特別な意味をもつ文字として解釈されないようにする。(正解)
入力にHTMLタグが含まれていたら、HTMLタグとして解釈されない他の文字列に置き換える。
入力に上位ディレクトリを指定する文字列(../)が含まれているときは受け付けない。
入力の全体の長さが制限を超えているときは受け付けない。

🔒 解説は解答すると表示されます

SQLインジェクション対策【午前解説】

正解の理由

正解は です。SQLインジェクションは、入力値がそのままSQL文の一部として解釈されることで発生します。入力中のシングルクォートやセミコロンなどを「ただのデータ」として扱うために、エスケープ処理あるいはより安全な方法としてパラメータ化(プレースホルダ、プリペアドステートメント)を用いれば、攻撃用のSQLが実行されなくなります。これにより、入力がデータベースの構文や命令へ影響を与えることを防げます。

解法ステップ

  1. 問題文から攻撃種類を特定する(ここではSQLインジェクション)。
  2. 各選択肢がどの攻撃・脅威に効くかを分類する(XSS、ディレクトリトラバーサル、入力検査など)。
  3. 「SQLの解釈」を直接変える選択肢を選ぶ。エスケープ/パラメータ化が該当する。
  4. 実運用面ではプリペアドステートメントや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: 一部のケースで有効なホワイトリスト検証は効果的ですが、全文字列を安全に扱うにはパラメータ化を併用すべきです。
Q2: ストアドプロシージャは安全ですか?
A2: ストアドプロシージャ自体は有益ですが、内部で動的SQLを文字列連結していると脆弱になります。プロシージャ内でもパラメータ化を使ってください。
Q3: 既存のコードベースが大量にある場合の対処は?
A3: 優先度を付けて影響範囲の大きい箇所からプレースホルダ化し、WebアプリのWAFやログ監視で補完するのが現実的です。
Q4: 長さ制限は無意味ですか?
A4: 全く無意味ではありませんが、攻撃を根本的に止めるものではないため、他の対策と併用してください。

関連キーワード: SQLインジェクション、入力検証、パラメータ化、プレースホルダ、エスケープ処理、プリペアドステートメント、ORM、ディレクトリトラバーサル、クロスサイトスクリプティング
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について