平成28年春期試験問題 午前Ⅱ 問21

"アカウント"表に対して,SQL文を実行したとき,"アカウント"表の全ての行が取得される入力パラメータはどれか。ここで,入力パラメータのエスケープ処理は行わない。また,";"はSQL文の終端として解釈されるものとする。
21.gif
〔SQL文〕
SELECT ID,ユーザー名,メールアドレス FROM アカウント
  WHERE ユーザー名 = '入力パラメータ'

  • ' OR '--' = '--
  • ' OR ユーザー名 = 'ユーザー名
  • '-- OR 1 = 1
  • \' OR 1 = 1 ';--
正解 問題へ
分野:テクノロジ系
中分類:データベース
小分類:データ操作
解説
それぞれの入力パラメータを代入したときに、WHERE句による選択条件がどのように変化するのかを検証します。
  • WHERE ユーザー名='' OR '--' = '--';
    OR演算の右辺である「'--' = '--'」の式は常に真を返すため、全ての行でWHERE句の結果は真になります。これにより"ユーザー名"列の値に関わらず全ての行が選択されることになります。したがって正解です。
    ※SQLにおいて「--」は、コメントを記述するための記法で「--」から行末までに記述された文字列はコメント扱いとなります。しかしこのSQL文では「--」はシングルクォートに囲まれているため、単なる文字列として扱われます。
  • WHERE ユーザー名='' OR ユーザー名 = 'ユーザー名';
    "ユーザー名"列の値が、空文字又は"ユーザー名"である行が選択対象となります。アカウント表にはこれを満たす行は存在しません。
  • WHERE ユーザー名=''-- OR 1 = 1';
    このSQL文の「--」以降をコメントだと考えると、実質的には以下と同じということになります。
    WHERE ユーザー名='';
    この条件では"ユーザー名"列の値が、空文字の行が選択対象になりますが、アカウント表にはこれを満たす行は存在しません。
  • WHERE ユーザー名='\' OR 1 = 1 ';--';
    SQLには、改行・タブなどの空白文字や、SQLの構文で使用される特殊文字('"%_\)を一般文字として扱うためのエスケープシーケンスが用意されています。このSQL文の「\'」の部分がそれに該当し、これは文字列の囲み文字ではなく文字としてのシングルクォート(')を表しています。また";"は1つのSQL文の終端を表し、";"より後は次のSQL文として解釈されます。しかしこのSQL文の";"以降は「--」でコメントアウトされた行のみであるため無視することができます。したがってこのSQL文は実質的に以下と同じということになります。
    WHERE ユーザー名='\' OR 1 = 1 ';
    黄色のマーカーで強調した部分が"ユーザー名"列の値と照合される文字列になります。アカウント表にはこれを満たす行は存在しません。

Pagetop