この概念が出た関連問題

この試験の対策ガイド

基本情報技術者試験 対策ガイド

合格率・勉強法・参考書の選び方をまとめています

見る →
答えと解説を見る(先に解くのがおすすめ)

正解は エ

解説

SQLインジェクション攻撃の対策として適切なものを選ぶ問題です。SQLインジェクションは、Webアプリケーションの入力フィールドに悪意のあるSQL文を埋め込み、データベースを不正操作する攻撃です。例:ログインフォームに「' OR '1'='1」を入力してWHERE句を無効化し不正ログインするなど。プレースホルダ(Prepared Statement)による対策:SQL文の雛形を先にデータベースエンジンに送り、パラメータは後から別途バインドする仕組みです。ユーザー入力はSQL文の「データ」として扱われ、SQL構文の一部として解釈されません。Javaではconn.prepareStatement()でプレースホルダを含むSQL文を作り、setString()で値をバインドします。これによりどんな文字列を入力されてもSQL文の構造が変化しないため、インジェクション攻撃が無効化されます。

なぜ他の選択肢は違うのか

選択肢 ア
「http://またはhttps://で始まるURLだけを許可する」はオープンリダイレクト攻撃やクリックジャッキングへの対策です。URLのプロトコルスキームを制限することはSQLインジェクションとは無関係です。
選択肢 イ
「外部からのパラメータでWebサーバ内のファイル名を直接指定しない」はディレクトリトラバーサル攻撃への対策です。ファイルパスの操作を防ぐ手法であり、SQLインジェクション対策ではありません。
選択肢 ウ
「スタイルシートを任意のWebサイトから取り込まない」はContent Security Policy(CSP)やCSSインジェクション対策です。クロスサイトスクリプティング(XSS)の防止に寄与しますが、SQLインジェクション対策ではありません。

解くときのポイント

SQLインジェクション対策=プレースホルダ(プリペアドステートメント)の使用が最も効果的。入力値をSQL文の「データ」として扱いSQL構文として解釈させない。エスケープ処理も対策の一つだが完全ではない。