情報処理安全確保支援士 2016年 春期 午前2 問21
問題文
“アカウント”表に対して、SQL文を実行したとき、“アカウント”表の全ての行が取得される入力パラメタはどれか。ここで、入力パラメタのエスケープ処理は行わない。また、“;” は SQL文の終端として解釈されるものとする。

選択肢
ア:' OR '--' = '--(正解)
イ:' OR ユーザ名 = 'ユーザ名
ウ:'-- OR 1 = 1
エ:¥' OR 1 = 1 ' ;--
“アカウント”表に対して、SQL文を実行したとき、“アカウント”表の全ての行が取得される入力パラメタはどれか【午前2 解説】
正解の理由
SQL文は以下の形です。
SELECT ID, ユーザ名、メールアドレス FROM アカウント WHERE ユーザ名 = '入力パラメタ';
ここで入力パラメタに ' OR '--' = '-- を入れると、SQLは次のように展開されます。
SELECT ID, ユーザ名、メールアドレス FROM アカウント WHERE ユーザ名 = '' OR '--' = '--';
'--' = '--' は常に真(True)であり、OR 条件のためWHERE句全体が真となり、全行が取得されます。さらに、-- はSQLのコメントアウト記号で、後続の不要な部分を無効化します。これによりSQL文の構文エラーも防げます。解法ステップ
- SQL文の構造を理解し、WHERE句の条件部分に注目する。
- 入力パラメタがどのようにSQL文に埋め込まれるかを文字列として展開する。
- 論理演算子
ORとコメントアウト--を使い、条件を常に真にする方法を考える。 - 各選択肢をSQL文に当てはめて、全行取得になるか検証する。
- 構文エラーが起きないかも確認し、最適な入力を選ぶ。
選択肢別の誤答解説
- ア: 正解。WHERE句が常に真となり、全行取得が可能。コメントアウトで後続無効化も完璧。
- イ:
' OR ユーザ名 = 'ユーザ名は文字列として不完全で、構文エラーや意図した条件にならない。 - ウ:
'-- OR 1 = 1はコメントアウトの位置が不適切で、SQL文が正しく解釈されずエラーになる。 - エ:
¥' OR 1 = 1 ';--はエスケープ文字¥が誤用されており、SQL文の構文エラーを引き起こす。
よくある誤解
- コメントアウト記号
--の使い方を誤り、SQL文が途中で切れてエラーになることがあります。 - 論理演算子
ORの前後の条件を正しく理解せず、全行取得に繋がらない入力を選ぶことがあります。
補足コラム
SQLインジェクションは、ユーザー入力を適切にエスケープせずにSQL文に埋め込むことで発生します。今回の問題はエスケープ処理がない前提で、悪意ある入力がSQL文の意味を変えてしまう典型例です。実務ではプリペアドステートメントやパラメータバインディングで防止します。
FAQ
Q: なぜコメントアウト記号
A:
-- が必要なのですか?A:
-- はSQLで以降の文字列を無効化し、余計な構文エラーを防ぐために使います。これにより条件式を正しく完結させられます。Q:
A: そのままでは構文エラーになることが多いです。文字列の囲みやコメントアウトを適切に使い、SQL文の構造を壊さずに条件を真にする必要があります。
OR 1=1 と書くだけでは全行取得にならないのですか?A: そのままでは構文エラーになることが多いです。文字列の囲みやコメントアウトを適切に使い、SQL文の構造を壊さずに条件を真にする必要があります。
関連キーワード: SQLインジェクション、WHERE句、コメントアウト、論理演算子、SQL文解析

\ せっかくなら /
情報処理安全確保支援士を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

