情報セキュリティスペシャリスト平成28年春期 午前U 問21

問21

"アカウント"表に対して,SQL文を実行したとき,"アカウント"表の全ての行が取得される入力パラメタはどれか。ここで,入力パラメタのエスケープ処理は行わない。また,";"はSQL文の終端として解釈されるものとする。
21.gif/image-size:337×217
  • ' 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 ';
    黄色のマーカーで強調した部分が"ユーザ名"列の値と照合される文字列になります。アカウント表にはこれを満たす行は存在しません。
© 2014-2023 情報処理安全確保支援士ドットコム All Rights Reserved.

Pagetop