情報処理安全確保支援士試験 2016年 春期 午前221


“アカウント”表に対して,SQL文を実行したとき,“アカウント”表の全ての行が取得される入力パラメタはどれか。ここで,入力パラメタのエスケープ処理は行わない。また,“;” は SQL文の終端として解釈されるものとする。
問題画像
' OR '--' = '--(正解)
' OR ユーザ名 = 'ユーザ名
'-- OR 1 = 1
¥' OR 1 = 1 ';--

解説

“アカウント”表に対して,SQL文を実行したとき,“アカウント”表の全ての行が取得される入力パラメタはどれか【午前2 解説】

要点まとめ

  • 結論:アの ' OR '--' = '-- が全行取得を可能にする入力パラメタです。
  • 根拠:WHERE句の条件が常に真となり、全レコードが抽出されるためです。
  • 差がつくポイント:SQLインジェクションの仕組みを理解し、コメントアウトや論理演算子の使い方を正確に把握することが重要です。

正解の理由

SQL文は以下の形です。
SELECT ID, ユーザ名, メールアドレス FROM アカウント WHERE ユーザ名 = '入力パラメタ';
ここで入力パラメタに ' OR '--' = '-- を入れると、SQLは次のように展開されます。
SELECT ID, ユーザ名, メールアドレス FROM アカウント WHERE ユーザ名 = '' OR '--' = '--';
'--' = '--' は常に真(True)であり、OR 条件のためWHERE句全体が真となり、全行が取得されます。さらに、-- はSQLのコメントアウト記号で、後続の不要な部分を無効化します。これによりSQL文の構文エラーも防げます。

よくある誤解

  • コメントアウト記号 -- の使い方を誤り、SQL文が途中で切れてエラーになることがあります。
  • 論理演算子 OR の前後の条件を正しく理解せず、全行取得に繋がらない入力を選ぶことがあります。

解法ステップ

  1. SQL文の構造を理解し、WHERE句の条件部分に注目する。
  2. 入力パラメタがどのようにSQL文に埋め込まれるかを文字列として展開する。
  3. 論理演算子 OR とコメントアウト -- を使い、条件を常に真にする方法を考える。
  4. 各選択肢をSQL文に当てはめて、全行取得になるか検証する。
  5. 構文エラーが起きないかも確認し、最適な入力を選ぶ。

選択肢別の誤答解説

  • ア: 正解。WHERE句が常に真となり、全行取得が可能。コメントアウトで後続無効化も完璧。
  • イ: ' OR ユーザ名 = 'ユーザ名 は文字列として不完全で、構文エラーや意図した条件にならない。
  • ウ: '-- OR 1 = 1 はコメントアウトの位置が不適切で、SQL文が正しく解釈されずエラーになる。
  • エ: ¥' OR 1 = 1 ';-- はエスケープ文字 ¥ が誤用されており、SQL文の構文エラーを引き起こす。

補足コラム

SQLインジェクションは、ユーザー入力を適切にエスケープせずにSQL文に埋め込むことで発生します。今回の問題はエスケープ処理がない前提で、悪意ある入力がSQL文の意味を変えてしまう典型例です。実務ではプリペアドステートメントやパラメータバインディングで防止します。

FAQ

Q: なぜコメントアウト記号 -- が必要なのですか?
A: -- はSQLで以降の文字列を無効化し、余計な構文エラーを防ぐために使います。これにより条件式を正しく完結させられます。
Q: OR 1=1 と書くだけでは全行取得にならないのですか?
A: そのままでは構文エラーになることが多いです。文字列の囲みやコメントアウトを適切に使い、SQL文の構造を壊さずに条件を真にする必要があります。

関連キーワード: SQLインジェクション, WHERE句, コメントアウト, 論理演算子, SQL文解析
← 前の問題へ次の問題へ →

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