平成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
- ア' OR '--' = '--
- イ' OR ユーザ名 = 'ユーザ名
- ウ'-- OR 1 = 1
- エ¥' OR 1 = 1 ';--
正解:ア
解説
入力パラメタのエスケープ処理が行われないため,SQL文の構文を変化させるような文字列を入力すると,SQLインジェクションが成立します。“' OR '--' = '--”を入力パラメタに当てはめると,WHERE句は「ユーザ名 = '' OR '--' = '--'」という形になります。ここで“--”はSQL文中でコメントの開始を示す記号ですが,シングルクォートで囲まれた文字列の中にある“--”は単なる文字列の一部として扱われ,結果として“'--' = '--'”という常に真となる文字列比較が成立します。したがって,WHERE句全体が常に真となり,“アカウント”表の全ての行が取得されます。
選択肢ごとの解説
- ア正しい。“' OR '--' = '--”は,クォートで囲まれた文字列同士の比較“'--' = '--'”が常に真となるため,WHERE句全体が真となり全ての行が取得されます。
- イ誤り。“' OR ユーザ名 = 'ユーザ名”は,列名ではなく文字列リテラル“ユーザ名”との比較になるため,ユーザ名の値が実際に「ユーザ名」という文字列である行以外は取得できません。
- ウ誤り。“'-- OR 1 = 1”は,先頭のシングルクォートの直後に“--”があるため,そこから先がコメントとして扱われ,“OR 1 = 1”の部分は実行されず,WHERE句が意図どおりに常に真とはなりません。
- エ誤り。“¥' OR 1 = 1 ';--”は,先頭の“¥”がシングルクォートをエスケープする文字として働く環境を想定した入力であり,本問のようにエスケープ処理が行われない場合には,前の“'”がそのまま文字列の終端として扱われ,意図した“OR 1 = 1”の効果が得られません。