SQL文を実行したとき,アカウント表の全ての行が取得される入力パラメータはどれか|情報処理安全確保支援士 平成28年 春期午前Ⅱ試験 問21

出典:平成28年春期 午前Ⅱ 問21 分野:データベース / データ操作
"アカウント"表に対して,SQL文を実行したとき,"アカウント"表の全ての行が取得される入力パラメータはどれか。ここで,入力パラメータのエスケープ処理は行わない。また,";"はSQL文の終端として解釈されるものとする。 アカウント
ID ユーザー名 メールアドレス
A001 TARO JOHO t-joho@email.org.jp
A002 JIRO JOHO j-joho@email.org.jp
A003 HANAKO JOHO h-joho@email.org.jp
〔SQL文〕 SELECT ID, ユーザー名, メールアドレス FROM アカウント   WHERE ユーザー名 = '入力パラメータ';
  • ア:' OR '--' = '--
  • イ:' OR ユーザー名 = 'ユーザー名
  • ウ:'-- OR 1 = 1
  • エ:\' OR 1 = 1 ';--
解説

この問題は、入力値をSQL文にそのまま埋め込んだ場合に発生するSQLインジェクションについて問うものです。入力パラメータのエスケープ処理を行っていないため、入力した「'」によって文字列を途中で終了させ、後ろに別のSQL条件を追加できてしまいます。

アの「' OR '--' = '--」を入力すると、WHERE句は実質的に次のようになります。

WHERE ユーザー名 = '' OR '--' = '--'

「'--' = '--'」は常に真になる条件です。そのため、ORの右側が全ての行で真となり、ユーザー名の値に関係なく「アカウント」表の全ての行が取得されます。

このようなSQLインジェクションを防ぐには、入力値をSQL文の文字列として直接連結するのではなく、プレースホルダを用いたプリペアドステートメントなどを利用することが基本です。

したがって、アが適切です。

❌他選択肢が誤りの理由
イ:' OR ユーザー名 = 'ユーザー名
⇒実質的に「WHERE ユーザー名 = '' OR ユーザー名 = 'ユーザー名'」となります。「ユーザー名」という値をもつ行だけが条件に一致するため、全ての行を取得する条件にはなりません。
ウ:'-- OR 1 = 1
⇒「--」以降がコメントとして扱われるため、実質的には「WHERE ユーザー名 = ''」という条件になります。「OR 1 = 1」の部分までコメントになってしまうので、全ての行を取得することはできません。
エ:\' OR 1 = 1 ';--
⇒引用符やセミコロンの位置によってSQL文として適切な条件式にならず、この設問の前提では全行を取得できる形にはなりません。全行を取得するには、アのように元の文字列を閉じた後、常に真となる条件をORで追加する必要があります。
TSUNAGARU-ADVICE

まず押さえたいこと

SQLインジェクションは、利用者が入力した値をSQL文に直接組み込むことで、SQLの条件や処理を不正に変更される攻撃です。この問題では、入力された引用符によって元の文字列を終了させ、ORで条件を追加できます。重要なのは、WHERE句全体が常に真になる条件を作れるかという点です。

迷ったときの判断軸

各選択肢の文字列をSQL文に代入し、完成したWHERE句を確認しましょう。引用符が正しく対応しているか、ORで追加した条件が常に真になるか、コメント記号がある場合はどこから無効化されるかを順番に確認します。コメント記号を使わなくても、恒真条件を作れば全行取得につながる場合があります。

科目Bにつなげるために

科目Bでは、SQL文の組立て方・入力値の処理・データベースのアクセス権限などを確認する場面があります。攻撃文字列だけを暗記するのではなく、入力データがSQLの命令や条件として解釈されることが問題だと理解しましょう。対策として、静的プレースホルダの利用やデータベースアカウントの最小権限化まで整理しておくことが重要です。