IPA過去問ドリル

平成28年度 春期 情報処理安全確保支援士試験 午前Ⅱ 問21

テクノロジ/セキュリティ

“アカウント”表に対して,SQL 文を実行したとき,“アカウント”表の全ての行が取得される入力パラメタはどれか。ここで,入力パラメタのエスケープ処理は行わない。また,“;”は SQL 文の終端として解釈されるものとする。 (注:本サイトでは原問題の表を文字表記に変換しています) アカウント表 ID|ユーザ名|メールアドレス A001|TARO JOHO|[email protected] A002|JIRO JOHO|[email protected] A003|HANAKO JOHO|[email protected] 〔SQL 文〕 SELECT ID,ユーザ名,メールアドレス FROM アカウント WHERE ユーザ名 = '入力パラメタ' ;

出典:平成28年度 春期 情報処理安全確保支援士試験 午前Ⅱ 問21

正解:ア

解説

入力パラメタのエスケープ処理が行われないため,SQL文の構文を変化させるような文字列を入力すると,SQLインジェクションが成立します。“' OR '--' = '--”を入力パラメタに当てはめると,WHERE句は「ユーザ名 = '' OR '--' = '--'」という形になります。ここで“--”はSQL文中でコメントの開始を示す記号ですが,シングルクォートで囲まれた文字列の中にある“--”は単なる文字列の一部として扱われ,結果として“'--' = '--'”という常に真となる文字列比較が成立します。したがって,WHERE句全体が常に真となり,“アカウント”表の全ての行が取得されます。

選択肢ごとの解説

  • 正しい。“' OR '--' = '--”は,クォートで囲まれた文字列同士の比較“'--' = '--'”が常に真となるため,WHERE句全体が真となり全ての行が取得されます。
  • 誤り。“' OR ユーザ名 = 'ユーザ名”は,列名ではなく文字列リテラル“ユーザ名”との比較になるため,ユーザ名の値が実際に「ユーザ名」という文字列である行以外は取得できません。
  • 誤り。“'-- OR 1 = 1”は,先頭のシングルクォートの直後に“--”があるため,そこから先がコメントとして扱われ,“OR 1 = 1”の部分は実行されず,WHERE句が意図どおりに常に真とはなりません。
  • 誤り。“¥' OR 1 = 1 ';--”は,先頭の“¥”がシングルクォートをエスケープする文字として働く環境を想定した入力であり,本問のようにエスケープ処理が行われない場合には,前の“'”がそのまま文字列の終端として扱われ,意図した“OR 1 = 1”の効果が得られません。
情報処理安全確保支援士の過去問を演習モードで解く