基本情報技術者試験「SQLインジェクション」の問題
あるWebアプリの一覧画面は、利用者が選んだ並べ替え対象の列名をSQL文のORDER BY句に直接埋め込んでいる。列名は値ではなく構文要素のためプレースホルダで束縛できず、入力をそのまま連結すると注入の余地が残る。この箇所の対策として、最も適切なものはどれか。
エ利用者の選択をサーバ側の正規の列名群と突き合わせ、合致した既定の列名だけをSQLに組み込む。
ア並べ替え対象の列名もプレースホルダの引数として渡し、データの値とまったく同じく束縛して扱う。
イ一覧画面に一度に表示する行数の上限を小さく設定し、応答に含める件数を抑えるようにする。
ウ並べ替えた結果をブラウザのキャッシュに残し、再表示の際の問合せ回数を減らすようにする。
正解
エ.利用者の選択をサーバ側の正規の列名群と突き合わせ、合致した既定の列名だけをSQLに組み込む。
ORDER BY句の列名は値ではなくSQLの構文要素であり、プレースホルダ(値の束縛)では扱えない。そのため、利用者の選択をサーバ側で保持する正規の列名群と突き合わせ、合致した場合のみあらかじめ用意した既定の列名をSQLに組み込む方式が適切である。任意の文字列がSQLへ混入する余地がなくなり、この箇所のSQLインジェクションを防げる。
?選択肢ごとの解説
エ ○ORDER BY句の列名は値ではなくSQLの構文要素であり、プレースホルダ(値の束縛)では扱えない。そのため、利用者の選択をサーバ側で保持する正規の列名群と突き合わせ、合致した場合のみあらかじめ用意した既定の列名をSQLに組み込む方式が適切である。任意の文字列がSQLへ混入する余地がなくなり、この箇所のSQLインジェクションを防げる。
ア ×列名は値ではなく構文要素のためプレースホルダで束縛できず、無理に値として渡しても並べ替えが意図どおり機能しないか注入を防げないため適切でない。
イ ×表示行数の上限縮小は返す件数を減らすだけで、列名に任意文字列が連結される注入の余地は残るため対策にならない。
ウ ×結果のキャッシュ保存は再表示時の性能向上に関わるだけで、列名連結による注入脆弱性とは無関係である。
✎くわしく
SQLインジェクション対策の基本はプレースホルダによる値と構文の分離だが、列名・テーブル名・並び順といった構文要素はプレースホルダで扱えない。このような箇所では『許可リスト(ホワイトリスト)方式』で、あらかじめ定めた安全な選択肢のみに限定するのが定石である。
✓本番での押さえどころ
試験のコツ
列名・並び順などプレースホルダで束縛できない構文要素への注入対策は、許可済み一覧との照合(ホワイトリスト方式)。
覚え方
値は『箱に入れて渡す(プレースホルダ)』、構文要素は『メニューから選ばせる(許可リスト)』。
よくある誤り
何でもプレースホルダで防げると考え、構文要素にまで適用しようとする。値はプレースホルダ、構文要素は許可リストと使い分ける。
情報セキュリティの他の問題
A社の経理担当者が、取引先を装ったメールに添付された請求書ファイルを業務PCで開いたところ、見慣れない画面が一瞬表示されて消…B社のWebサービスで、複数の利用者アカウントに対し正しいIDとパスワードの組合せによるログインが短時間に外部から成立する事…C社では、退職予定者や異動者のアカウント権限の見直しが滞り、業務上不要になった共有フォルダへのアクセス権が残り続けている。情…D社のファイルサーバがランサムウェアに感染し、業務ファイルが暗号化された。D社は日次でバックアップを取得しているが、バックア…E社の従業員に、取引先銀行を名乗る『口座情報の更新が必要』というメールが届いた。本文中のリンク先URLにアクセスすると、銀行…F社は社外の従業員が、カフェなどの公衆無線LANを利用して社内システムへアクセスしている。通信内容が経路上で第三者に盗聴・改…
この問題を、AIの8-ways解説つきで。
無料ではじめる →基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。
ukamiru 過去問 · 基本情報技術者試験 · fe-b-sec-0108