この記事では,令和4年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問1の解説(独自の見解)を行います.また,類題の出題状況や傾向,問題タイプなどの出題分析も掲載しています.
情報処理安全確保支援士試験に向けて勉強されている方の参考になれば幸いです.
本記事における出典:令和4年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問1
IPA(問題冊子・解答例・採点講評)のリンク
本記事内の解答例については,全てIPA公式からの引用になります.
設問1 表1(脆弱性検査方法)について
本問は,全て知識問題(用語の選択・空欄補充)でした.
(1) 下線①について,適切な文字列の例
表1下線①前後の文章を抜粋したものを以下に示します.
利用者の入力を基にHTTPレスポンスヘッダを生成する処理において,① 改行コードを意味する文字列を入力したときに,HTTPヘッダフィールドが追加されないことを確認する.
ア) %0D%0A イ) %20 ウ) <br> エ) <p>
解答例
ア(%0D%%0A)
解説
HTTPのレスポンスヘッダにおいては,CR(キャリッジリターン,%0D)とLF(ラインフィード,%0A)の組み合わせであるCRLF(%0D%0A)が改行コードとして認識されます.
従って,本問で問われている下線①について,適切な文字列の例としては,ア(%0D%%0A)が正解となります.
参考までに,他の選択肢についても解説します.
イ(%20)は,スペースとして認識されます.
ウ(<br>)は,HTMLにおける改行タグであり,HTTPヘッダでは無効です.
エ(<p>)は,HTMLにおける段落タグであり,<br>タグ同様にHTTPヘッダでは無効です.
(2) 下線②の名称
表1下線②前後の文章を抜粋したものを以下に示します.
SQL文の組立てにおいて,SQL文のひな形の中に②変数の場所を示す?記号を置く技法を利用する.
解答例
プレースホルダ
解説
SQL文を動的に組立てる際に,変数の場所に置く?等の記号をプレースホルダと呼びます.実行時に,?で置いた部分に実際の変数をバインド(割り当て)します.以下は,その使用例です.
SELECT * FROM users WHERE username = ? AND password = ?;プレースホルダについては,午前Ⅱ問題でも頻出のキーワードですので,重点的に確認しておきましょう.
(3) 表1中の空欄【 a 】に入れる適切な字句
メールヘッダインジェクションへの対策として,「外部からの入力の全てについて,【 a 】を削除する」.
解答例
改行コード(5字)
解説
IPAが公開している「安全なウェブサイトの作り方」から,そのままの出題でした.メールヘッダ・インジェクションの保険的対策として,「外部からの入力の全てについて、改行コードを削除する。」とあります.
メール送信機能(mail関数 等)において,攻撃者が改行コードを挿入することで,(任意の)追加ヘッダや本文を意図的に埋め込む攻撃のことです.
これが成立してしまうと,差出人の偽装やBCCへのスパム送信等が行われる可能性が高くなります.
メールヘッダは,一般的にCRLF(改行コード)で区切られており,ユーザー入力の中に改行コードが含まれると,新しいヘッダの不正追加が可能になるため,対策としては「外部からの入力の全てについて,【 改行コード 】を削除する」方法が有効です.
ただし,実運用においては,Webアプリケーションがメール本文に出力するデータ等,改行コードを含みうる文字列にも,全ての入力に対して処理を行うと,そのWebアプリケーションが正しく動作しなくなるため注意が必要です.
本問のように,「安全なウェブサイトの作り方」から,そのまま出題される事例もあるため,セキュアプログラミング(Webアプリケーション開発)で受験される方は,一度目を通されることをオススメします.
設問2 〔情報選択機能の脆弱性〕について
こちらは,知識問題と読解問題の融合型でした.
(1) 下線③について,具体的な方法
Sシステム改修後の脆弱性検査で,情報セキュリティ部は,プロジェクトの情報番号と情報名を,そのプロジェクトには参加していない利用者が,③ そのプロジェクトに参加しているかのように偽ってリスト可能であるという脆弱性を指摘した.
未参加のプロジェクトに参加しているかのように偽るための操作を40字以内で,具体的に解答します.
解答例
クエリ文字列のidに,未参加のプロジェクトのプロジェクトIDを指定する.(37字)
解説
下線③の数行上にある文章に注目です.
方法1:ログイン時にその利用者IDに対して登録されているプロジェクトIDを取得し,GETリクエストのクエリ文字列に,“id=プロジェクトID”の形で指定する.情報選択機能は,クエリ文字列からプロジェクトIDを取得する.
「GETリクエストのクエリ文字列」とあります.つまり,ブラウザのアドレスバーは,「https://(省略)/project/show?id=20001」のような形式になります.
従って,利用者が任意のプロジェクトIDをクエリ文字列に指定することで,自由自在にプロジェクトに関する情報を閲覧出来てしまう状況です.
以上により,「クエリ文字列のidに,未参加のプロジェクトのプロジェクトIDを指定する.」という解答を導くことができます.
(2) 方法1の脆弱性が方法2で解決される理由
方法2:情報選択機能の利用時に,セッション情報から利用者情報を取得する.情報選択機能は,当該利用者情報からプロジェクトIDを取得する.
情報セキュリティ部は,④ 方法1の脆弱性が方法2で解決されることを確認した.
解答例
・プロジェクトを示すパラメタを外部から指定できないから
・セッション情報からプロジェクトIDを取得するから
(上記より,いずれか1つ)
解説
解答のポイントとしては,方法2によって,利用者が任意の(自由自在に)プロジェクトIDを指定出来なくなったという点です.このポイントを抑えつつ,問題文に即して具体的に記述されていたら,広く正解として扱われたものと思われます.
(3) 図2及び図3の空欄【 b 】に入れる適切な字句
// (途中,省略)
String sql = "SELECT 情報番号, 情報名 FROM 情報管理テーブル WHERE プロジェクトID = ?";
java.sql.【 b 】stmt = con.prepareStatement(sql);
【 c 】.setInt(1, projectId);
java.sql.ResultSet rs = stmt.executeQuery();
// (以下,省略)// (途中,省略)
String sql = "SELECT 情報番号, 情報名 FROM 情報管理テーブル WHERE プロジェクトID = 【 d 】";
java.sql.【 b 】stmt = con.prepareStatement(sql);
// (以下,省略)ア) Connection イ) DriverManager ウ) PreparedStatement エ) Statement
解答例
ウ(PreparedStatement)
解説
PreparedStatement は,SQL文にパラメータをバインドし,実行時に効率的に利用できるようにするためのクラスです.従って,空欄bに入るのはウのPreparedStatementになります.
念のため,他の選択肢についても見ておきましょう.
アのConnection は,データベースとの接続を管理するオブジェクトです.Connection オブジェクトは,SQL文を実行したり,データベースとの通信を管理したりするために使います.
Connection は,PreparedStatement のインスタンスを作成するために必要ですが,SQL文の実行自体には直接使われません.従って,空欄bには適切ではありません.
イのDriverManager は,JDBCドライバを管理するクラスであり,データベースへの接続を確立するための Connection オブジェクトを取得する役割を持っています.DriverManager は Connection を取得するために使いますが,SQL文の準備や実行は担当しません.
エのStatementは,SQL文をそのまま実行する場合に使います.一方で,今回のようにプレースホルダ(?)を使ってパラメータを渡す場合には,PreparedStatement を使います.
(4) 図2中の空欄【 c 】に入れる適切な字句
図2(プログラム)の空欄については,前章の(3)を参照してください.
解答例
stmt
解説
stmt.setInt(1, projectId); は,最初のプレースホルダ ? に,projectId の値を設定(バインド)するものです.
設問3 図3中の空欄【 d 】に入れる適切な字句
図3(プログラム)の空欄については,前章の(3)を参照してください.
解答例
情報番号 = ? AND プロジェクトID = ?
解説
情報番号による指定に加え,プロジェクトIDをANDで条件指定することにより,当該プロジェクトに参加している利用者にのみ情報を表示します.

