情報セキュリティ

基本情報技術者試験SQLインジェクション」の問題

情報セキュリティ情報セキュリティ難易度:hard
あるWebアプリの一覧画面は、利用者が選んだ並べ替え対象の列名をSQL文のORDER BY句に直接埋め込んでいる。列名は値ではなく構文要素のためプレースホルダで束縛できず、入力をそのまま連結すると注入の余地が残る。この箇所の対策として、最も適切なものはどれか。
利用者の選択をサーバ側の正規の列名群と突き合わせ、合致した既定の列名だけをSQLに組み込む。
並べ替え対象の列名もプレースホルダの引数として渡し、データの値とまったく同じく束縛して扱う。
一覧画面に一度に表示する行数の上限を小さく設定し、応答に含める件数を抑えるようにする。
並べ替えた結果をブラウザのキャッシュに残し、再表示の際の問合せ回数を減らすようにする。
正解
利用者の選択をサーバ側の正規の列名群と突き合わせ、合致した既定の列名だけをSQLに組み込む。

ORDER BY句の列名は値ではなくSQLの構文要素であり、プレースホルダ(値の束縛)では扱えない。そのため、利用者の選択をサーバ側で保持する正規の列名群と突き合わせ、合致した場合のみあらかじめ用意した既定の列名をSQLに組み込む方式が適切である。任意の文字列がSQLへ混入する余地がなくなり、この箇所のSQLインジェクションを防げる。

?選択肢ごとの解説

エ ○ORDER BY句の列名は値ではなくSQLの構文要素であり、プレースホルダ(値の束縛)では扱えない。そのため、利用者の選択をサーバ側で保持する正規の列名群と突き合わせ、合致した場合のみあらかじめ用意した既定の列名をSQLに組み込む方式が適切である。任意の文字列がSQLへ混入する余地がなくなり、この箇所のSQLインジェクションを防げる。
ア ×列名は値ではなく構文要素のためプレースホルダで束縛できず、無理に値として渡しても並べ替えが意図どおり機能しないか注入を防げないため適切でない。
イ ×表示行数の上限縮小は返す件数を減らすだけで、列名に任意文字列が連結される注入の余地は残るため対策にならない。
ウ ×結果のキャッシュ保存は再表示時の性能向上に関わるだけで、列名連結による注入脆弱性とは無関係である。

くわしく

SQLインジェクション対策の基本はプレースホルダによる値と構文の分離だが、列名・テーブル名・並び順といった構文要素はプレースホルダで扱えない。このような箇所では『許可リスト(ホワイトリスト)方式』で、あらかじめ定めた安全な選択肢のみに限定するのが定石である。

本番での押さえどころ

試験のコツ

列名・並び順などプレースホルダで束縛できない構文要素への注入対策は、許可済み一覧との照合(ホワイトリスト方式)。

覚え方

値は『箱に入れて渡す(プレースホルダ)』、構文要素は『メニューから選ばせる(許可リスト)』。

よくある誤り

何でもプレースホルダで防げると考え、構文要素にまで適用しようとする。値はプレースホルダ、構文要素は許可リストと使い分ける。

情報セキュリティの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-sec-0108

【基本情報技術者試験】SQLインジェクションの問題 — 解答・解説|ukamiru 過去問