戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

情報処理安全確保支援士 2013年 秋期 午後1 問01


Webシステムのクロスサイトスクリプティング対策に関する次の記述を読んで、設問1、2に答えよ。

   E社は、提携店舗数100店の賃貸不動産仲介業者である。E社では、3年前に開設したWebシステム(以下、Eシステムという)を用いて賃貸物件情報を提供している。Eシステムの運用はシステム部が担当し、Eシステムの保守とコンテンツの開発はEシステムの開発を担当したB社に委託している。  E社は、Eシステムをインターネットに公開することを踏まえて、IPAが公表している“安全なウェブサイトの作り方”のチェックリストを参考にしてセキュリティ対策の実施項目を作成し、その実施項目に従ってJavaで開発するようB社に依頼していた。対策の実施項目のうち、クロスサイトスクリプティング(以下、XSSという)対策の実施項目を、表1に示す。
情報処理安全確保支援士試験(平成25年度 午後1 問01 表01) ↩設問1(1) ↩設問2(2) ↩設問2(6)
〔社内検査〕  Eシステム開発後、他社のWebサイトでXSS対策漏れが原因の事故が多発したことから、Eシステムにも問題が潜在していることが懸念された。そこで容易に検査できる方法はないかと探していたところ、基本的なXSS対策を実施しているかどうかを診断する“ウェブ健康診断仕様”(以下、Web健康診断という)が、“安全なウェブサイトの作り方”の別冊としてIPAから公表されているとの情報を得た。表2はWeb健康診断に基づいて作成したXSS対策の判定基準である。システム部のC部長は、表2の内容であれば、社内で検査できると考え、若手のD君を担当に指名した。  表2の判定基準では、“対象画面”の“検査文字列を入力する場所”に“入力する検査文字列”を入力した場合に、“脆弱性ありと判定する基準”で示された基準で脆弱性ありと判定する。
 図1はEシステムのうち、賃貸物件の選択結果を表示するプログラムである。D君が表2の判定基準に基づいて検査をしたところ、検出パターンaの検査で脆弱性ありと判定された。その原因箇所は図1のプログラムのb行目であった。図1に、他の脆弱性ありと判定されたものはなかった。
〔詳細な診断の受診〕  表2の判定基準に基づいた社内検査で脆弱性が検出されたことから、C部長は詳細な診断を受ける必要があると判断し、セキュリティ専門会社のF社に詳細な診断を依頼した。F社では、インターネット経由でのアクセスによるEシステムの診断とサーバプログラムのソースコードレビューを行った。F社による診断結果を、図2に示す。
情報処理安全確保支援士試験(平成25年度 午後1 問01 図02)
〔プログラムの修正〕  図3の賃貸物件の検索画面を表示するプログラムでは、賃貸物件を検索するキーワードと地区名を設定するための画面を表示する。その次に呼び出される図4の賃貸物件の検索結果を表示するプログラムでは、そのキーワードと地区名を用いて賃貸物件を検索し、その結果をオプションメニューで表示する。オプションの選択が変更された際に、表示用に用意されているテキスト領域に、賃貸物件の情報を“[地区名]説明”の形式で表示する。選択ボタンが押下されると、図1のプログラムが呼び出される。
 F社による診断結果に基づき、図3と図4のプログラムを詳しく検討し、次のとおり問題点を整理して修正することとした。
(1) 図3の賃貸物件の検索画面を表示するプログラムの問題点と修正  問題点:c行目とd行目では、表1の実施項目eに該当する対策が行われていなかった。社内検査では、検査対象をfに限定しているのでD君はこの脆弱性を検出できなかった。  修正:エスケープ処理が必要であり、定義されているメソッドgを適用すべきである。
情報処理安全確保支援士試験(平成25年度 午後1 問01 図03)
(2) 図4の賃貸物件の検索結果を表示するプログラムの問題点と修正  問題点:h行目では、表1の実施項目iに該当する対策が不十分であった。  修正:h行目をjに修正すべきである。
情報処理安全確保支援士試験(平成25年度 午後1 問01 図04)
 E社は、今回のXSS対策以外の対策も含めてEシステムの修正をB社に依頼し、修正後、再度F社の診断を受診し、問題が解決していることを確認した。

設問1:〔社内検査〕について、(1)〜(4)に答えよ。

問題文を見る
(1)表2の検出パターン1〜4は、それぞれ表1の②〜⑥のどの実施項目の不備を検出できるものか。それぞれに該当する最も適切な項番を答えよ。

模範解答

パターン1:② パターン2:② パターン3:② パターン4:③

解説

解答の論理構成

  1. 検出パターン1〜3の検査文字列はすべてGET/POSTパラメタやURLのパス部に '><hr> や '><script>…</script> を埋め込み、「HTTPレスポンスボディに検査文字列がエスケープ処理などを行われずに出力される場合、脆弱性ありと判定」と定義されています。これは、表1の実施項目②「Webページに出力する全ての要素に対して、エスケープ処理を施す。」が守られていなければ発生する問題です。
    • したがって、パターン1・2・3はいずれも②の不備を検出します。
  2. 検出パターン4は、検査文字列にjavascript:alert(document.cookie); を用い、「HTTPレスポンスボディの特定のURI属性(src, action, background, href, content)に検査文字列が出力される場合、脆弱性ありと判定」とされています。URI属性にjavascript: スキームがそのまま出力されるのは、表1の実施項目③「URLを出力するときは、"http://" 又は "https://" で始まるURLだけを許可する。」を満たしていないために起こります。
    • したがって、パターン4は③の不備を検出します。
以上より
パターン1:②
パターン2:②
パターン3:②
パターン4:③

誤りやすいポイント

  • パターン4を「エスケープ漏れ」と誤認して②を選びがちです。URI属性に出力されるか否かに着目し、URLスキーム制限③の観点で判断することが重要です。
  • パターン1と2の違い(単なるタグ挿入かscript挿入か)に惑わされて別の実施項目を当てはめてしまうケースがありますが、どちらも同じ「エスケープ処理漏れ」のチェックです。
  • 表1の文章を正しく引用・照合せずに「スクリプト生成=④」と機械的に結論づけて失点する例が多いです。検査手順と項目の対応関係を必ず確認しましょう。

FAQ

Q: パラメタ値がそのまま <img src> などに入る場合はどの実施項目で防ぐのですか?
A: 出力先がURI属性であれば③でスキームを制限し、同時に②でエスケープ処理も行います。基本は多層防御です。
Q: escapeHTMLを使ってもXSSが防げない場面はありますか?
A: JavaScript内文字列やCSSコンテキストなど、HTMLエスケープでは不十分な場所があります。適切なコンテキストエスケープを使う必要があります。

関連キーワード: XSS, エスケープ処理、URIスキーム制限、検査文字列、コンテンツ出力

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:〔社内検査〕について、(1)〜(4)に答えよ。

問題文を見る
(2)本文中のaに入れる適切な検出パターンを1〜4から選び答えよ。

模範解答

a:4

解説

解答の論理構成

  1. 表2の“検出パターン”を確認します。
    – 「4」の説明は
    「HTTPレスポンスボディの特定のURI属性(src, action, background, href, content)に検査文字列が出力される場合、脆弱性ありと判定」
    というものです。
  2. 図1のプログラムb行目(21行目)は
    out.print ("<a href=""+ escapeHTML(rqUrl) + "">");
    となっており、クライアントから受け取ったrqUrlを <a> タグのhref属性へそのまま出力しています。
  3. escapeHTMLは「<、>、&、"、'」の5文字しか変換しません。よってjavascript:alert(document.cookie); のようなスキーム名やコロンはそのまま残ります。
  4. 表2の検出パターン「4」の検査文字列は
    javascript:alert(document.cookie);
    であり、そのままhrefに入ればリンククリック時にJavaScriptが実行されます。
  5. したがって、図1b行目で表2「4」の判定条件
    「HTTPレスポンスボディの特定のURI属性(…href…)に検査文字列が出力される」
    が満たされるため、脆弱性を検出できるのは検出パターン「4」です。

誤りやすいポイント

  • escapeHTMLを使っているから安全だと思い込み、javascript: スキームを許容している点を見落としやすいです。
  • 表2「1」「2」は“ボディにそのまま表示されるか”をチェックするもので、URI属性への挿入とは判定基準が異なることを混同しがちです。
  • “入力内容確認画面”と“エラー画面”という対象画面の違いだけで選択してしまい、本質である“URI属性への出力可否”を読み飛ばすケースが多発します。

FAQ

Q: escapeHTMLで "javascript:..." を出力してもブラウザは実行してしまうのですか?
A: はい。HTML特殊文字のエスケープではURIスキーム名やコロンは変換されません。hrefにjavascript: が残ればリンククリック時にスクリプトが実行されます。
Q: URLを限定するチェックはどの実施項目に相当しますか?
A: 表1の「③」「URLを出力するときは、“http://” 又は “https://” で始まるURLだけを許可する。」が該当します。今回の不備もここに抵触します。
Q: URI属性対策としては何を実装すれば良いですか?
A: 文字列エスケープだけでなく、“スキーム名はhttp/httpsのみ”といったホワイトリスト検査を組み合わせることが推奨されます。

関連キーワード: クロスサイトスクリプティング、URIスキーム、属性インジェクション、ホワイトリスト検証、HTMLエスケープ

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:〔社内検査〕について、(1)〜(4)に答えよ。

問題文を見る
(3)本文中のbに入れる適切な行番号を答えよ。

模範解答

b:18

解説

解答の論理構成

  1. 【問題文】の“社内検査”では、D君が“検出パターンaの検査で脆弱性ありと判定された”とある。さらに、検出パターンaがどれかは表2を見ると、URI属性に値を埋め込むケース(検出パターン4)のみが“javascript:alert(document.cookie);”を用いている。
  2. 検出パターン4の“脆弱性ありと判定する基準”は「HTTPレスポンスボディの特定のURI属性(src, action, background, href, content)に検査文字列が出力される場合」と書かれている。
  3. 図1のプログラムでURI属性(href)にユーザ入力を直接出力している箇所は
    out.print ("<a href=""+ escapeHTML(rqUrl) + "">");
    しかない。
  4. この文は図1の【問題文引用】「out.print ("<a href=\""+ escapeHTML(rqUrl) + "\">");」の行であり、図では行番号bとなっている。実際の図1の行番号は“18”。
  5. したがって、脆弱性の原因行 b は “18” である。

誤りやすいポイント

  • 「escapeHTML」で <、>、&、"、' を逃がしているので安全だと早合点しやすいが、表1の実施項目③「"http://" 又は "https://" で始まるURLだけを許可する」が未実装のためjavascript: スキームを完全に防げない。
  • “href” や “src” などURI属性の検査は、文字列エスケープだけでなくホワイトリスト方式のスキーム制限が必須であることを見落としやすい。
  • 行番号を探す際、図1には省略行((省略) のコメント)があるため、表示されている数字を正確に追わないとずれてしまう。

FAQ

Q: 行21ではなく行18になる理由は?
A: 図1の実際の行数はコメント部分も含めてカウントされており、問題冊子に印字された番号が“18”になっているためです。
Q: escapeHTML(rqUrl) を掛けているのに、なぜ “javascript:” で実行されるのですか?
A: “javascript:alert(document.cookie);” には < や > 等の特殊文字が含まれないため、escapeHTMLによる変換後もそのままhrefの値として出力され、ブラウザはJavaScript URIとして解釈します。
Q: 表1の実施項目③を実装すると具体的にはどうするのですか?
A: rqUrlの先頭を正規表現 ^https?:// でチェックし、条件を満たさない場合はリンクを生成しない、または固定ページへリダイレクトするなどの処理を行います。

関連キーワード: クロスサイトスクリプティング、URIスキーム制限、HTMLエスケープ、href属性、ホワイトリスト

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:〔社内検査〕について、(1)〜(4)に答えよ。

問題文を見る
(4)図1のプログラムのb行目に対して実施するXSS対策を40字以内で述べよ。

模範解答

“http://” 又は “https://” で始まるURLだけを許可する。

解説

解答の論理構成

  • 図1のb行目では、out.print ("<a href=""+ escapeHTML(rqUrl) + "">"); と、利用者入力のrqUrlをhref属性にそのまま出力しています。
  • escapeHTMLは【問題文】注記のとおり <、>、&、"、' をエスケープするだけなので、javascript: などのスキーム名には一切影響しません。
  • Web健康診断の検出パターン4は「javascript:alert(document.cookie); がURI属性(src, action, background, href, content)に出力される場合、脆弱性ありと判定」と定義されており、今回まさにhrefが問題箇所です。
  • 表1の実施項目③は「URLを出力するときは、"http://" 又は "https://" で始まるURLだけを許可する。」と規定しており、これが漏れているため外部スクリプト起動を阻止できていません。
  • よって、rqUrlが "http://" または "https://" で始まる場合のみリンクとして採用し、それ以外は拒否・無効化するホワイトリスト方式を取るべきであり、設問の模範解答に帰着します。

誤りやすいポイント

  • 「HTMLエスケープさえ行えばXSSは防げる」と思い込み、URIスキームの検査を失念する。
  • ブラックリストでjavascript: だけを弾こうとし、data:text/html;base64,... など別スキームを見落とす。
  • GET/POSTパラメータだけをテストし、今回のように隠しフィールドや属性値に渡されるケースを検査対象外にしてしまう。
  • 正規表現でURLをチェックする際、大小文字混在や全角半角を考慮せずバイパスを許してしまう。

FAQ

Q: escapeHTMLを呼んでいるのに何故XSSが成立するのですか?
A: 文字実体参照はタグや属性の区切り文字を無害化するだけで、javascript: のような危険なURIスキーム自体はそのまま残るため、リンクをクリックするとスクリプトが実行されます。
Q: POST送信に変更すれば安全になりますか?
A: 送信方法は関係ありません。最終的にブラウザへ返すレスポンスに危険な文字列が混入すればXSSとなるため、URIのフィルタリングが必要です。
Q: http/https以外を全部拒否すると業務影響はありませんか?
A: 社内要件を確認し、mailtoなど業務で使わないスキームはブロックしても問題になりにくいケースがほとんどです。もし必要なスキームがあれば、追加でホワイトリストに登録してください。

関連キーワード: XSS, URIスキーム、ホワイトリスト、HTMLエスケープ、href属性

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔プログラムの修正〕について、(1)〜(7)に答えよ。

問題文を見る
(1)本文中のc、dに入れる適切な行番号を答えよ。(c, dは順不同)

模範解答

c:17 d:24

解説

解答の論理構成

  1. 図3のコードを確認すると、データベースから取得した値をそのままHTMLに埋め込んでいる行が二つある。
    ・out.println("よく用いられるキーワード:" + rsKey);
    ・out.println("<option value=¥"" + rsLoc + "¥">" + rsLoc + "</option>");
  2. これらの行では、表1の実施項目②「Webページに出力する全ての要素に対して、エスケープ処理を施す。」が適用されていない。
  3. F社の診断コメント「社内検査の検査対象以外に、対策漏れがある。」は、まさにrsKey・rsLocの出力部分を指摘している。
  4. 図3の行番号と照合すると、上記の2行はc=17行目、d=24行目である。
  5. 社内検査では「検査対象をfに限定」していたため、データベース由来の値は検査範囲外となりD君は検出できなかった。
  6. 以上より、c と d には「17」「24」が入る。

誤りやすいポイント

  • 画面入力値だけを疑い、データベースや設定ファイルなど“内部ソース”から流入する値のXSSを見逃しやすい。
  • 行番号はコメントや省略行を含めた“試験冊子ベース”で付与される。IDEで表示させた番号と食い違うことに注意。
  • value="..." 属性にもエスケープが必要という基本をうっかり忘れるケースが頻発する。

FAQ

Q: rsKeyとrsLocは運用者が入力しているので安全では?
A: 運用者端末がマルウェアに感染している可能性など、完全に信頼できるとは限りません。全ての出力は原則エスケープすべきです。
Q: escapeHTMLを呼ぶ以外の対策でも合格できますか?
A: 試験では「表1の実施項目②」に該当する“HTMLエスケープ”が要求事項です。メソッド名は自由ですが、同等の処理が必須です。
Q: optionタグのvalueまでもエスケープするのは過剰では?
A: JavaScriptで値を再利用する場合などにXSS経路となり得ます。属性値も文字参照化しておくことが推奨です。

関連キーワード: XSS, エスケープ処理、HTML特殊文字、サニタイゼーション、データベース

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔プログラムの修正〕について、(1)〜(7)に答えよ。

問題文を見る
(2)本文中のeに入れる最も適切な実施項目を表1の②〜⑥から選び答えよ。

模範解答

e:②

解説

解答の論理構成

  1. まず設問は、図3のc行目とd行目で欠けている対策が表1のどの項目に該当するかを問うています。
  2. 図3の該当行を確認すると
    ・[19] out.println("よく用いられるキーワード:" + rsKey);
    ・[26] out.println("<option value=¥"" + rsLoc + "¥">" + rsLoc + "</option>");
    いずれもデータベースから取得した文字列rsKeyやrsLocを そのまま HTMLに出力しています。
  3. 表1の実施項目を再確認すると
     「② Webページに出力する全ての要素に対して、エスケープ処理を施す。」
     と定義されています。
  4. 本来はescapeHTML(rsKey) やescapeHTML(rsLoc) のようにエスケープ処理を行う必要がありますが、実装されていないため、表1の実施項目「②」に違反していると判断できます。
  5. したがって e に入るのは 「②」 です。

誤りやすいポイント

  • 「③ URL制限」と混同する
    value属性にURLが入る場面があるため項目③と勘違いしやすいですが、問題となっているのは 属性値の検証 ではなく 文字列のエスケープ漏れ です。
  • 「入力フォームだからサーバ側で自動的にサニタイズされているはず」と思い込む
    HTML組み立て時に手動で + 連結している限り、自動サニタイズは行われません。
  • エスケープ対象が「<」「>」だけだと思い、" や ' を見落とす
    属性値では " が閉じられてスクリプトが開始される典型的なXSSパターンになります。

FAQ

Q: 「②」を満たす実装例は?
A: out.println("よく用いられるキーワード:" + escapeHTML(rsKey)); のように、HTMLに出力する前に必ずescapeHTMLなどで <、>、&、"、' をエスケープします。
Q: データベースから取得した値なら安全では?
A: いいえ。攻撃者が運用者アカウントを入手して悪意あるデータを登録する、あるいは別経路で登録される可能性があるため、出力時のエスケープは必須です。
Q: JSPやテンプレートエンジンを使えば自動的に防げる?
A: 近年のフレームワークは自動エスケープ機能を備えていますが、<%= %> 直書きや属性連結でバイパスされることがあります。仕組みに頼らず出力箇所を確認しましょう。

関連キーワード: クロスサイトスクリプティング、エスケープ処理、HTML出力、入力値検証、凡例属性

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔プログラムの修正〕について、(1)〜(7)に答えよ。

問題文を見る
(3)本文中のfに入れる適切な字句を、表2中の字句を用いて20字以内で述べよ。

模範解答

f:GETパラメタ及びPOSTパラメタ

解説

解答の論理構成

  • 【問題文】では、図3のプログラムについて
    “社内検査では、検査対象をfに限定しているのでD君はこの脆弱性を検出できなかった。”
    と記載されています。
  • 社内検査の基準は、表2 “Web健康診断に基づいて作成したXSS対策の判定基準” で示されます。
    検出パターン1・2の “検査文字列を入力する場所” は
    “"GETパラメタ及びPOSTパラメタ"” と明示されています。
  • つまりD君が行った社内検査は、入力位置を “"GETパラメタ及びPOSTパラメタ"” に限定していたため、 図3の <option> 生成部など “検査対象以外” の出力箇所は未検査となり、脆弱性を見逃しました。
  • 以上から、f に入る字句は表2にそのまま載っている
    “"GETパラメタ及びPOSTパラメタ"” が適切です。

誤りやすいポイント

  • “URL中最後の"/"に続く文字列” や “特定のURI属性” と混同し、検査対象をURI全般と誤解する。
  • 表2の列見出しを引用せずに要約表現(例:リクエストパラメータのみ)で書いてしまう。
  • “GET” と “POST” の間をコンマやスラッシュでつなぎ、原文を改変してしまう。

FAQ

Q: どうして “GETパラメタ及びPOSTパラメタ” をそのまま書かないと減点になるのですか?
A: 問題指示に “数字・固有名詞・関係名などは必ず原文を正確に引用” とあるため、省略や書き換えは不可です。
Q: 社内検査で漏れた脆弱性は具体的にどこから入力される想定ですか?
A: <option> 要素のラベルや値といった “選択肢生成時の出力” 部分であり、GET/POST以外の経路です。
Q: 今回のような検査漏れを防ぐには?
A: パラメタ以外の “全出力箇所” を対象にしたコードレビューと、自動ツールによる網羅的テストが有効です。

関連キーワード: XSS, エスケープ処理、GETパラメタ、POSTパラメタ、URI属性

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔プログラムの修正〕について、(1)〜(7)に答えよ。

問題文を見る
(4)本文中のgに入れる適切なメソッド名を答えよ。

模範解答

g:escapeHTML

解説

解答の論理構成

  1. 問題文は、賃貸物件検索画面(図3)の修正方針として
    ― “修正:エスケープ処理が必要であり、定義されているメソッドgを適用すべきである。”
    と指示しています。
  2. 既に実装済みの賃貸物件選択結果画面(図1)では、URIも文字列も画面出力前に
    ― escapeHTML(...)
    を使ってエスケープしていることが説明されています。
  3. したがって、図3でも同じXSS対策メソッドを再利用するのが自然であり、g には “escapeHTML” が入ります。
  4. 以上より、解答は
    g:escapeHTML
    となります。

誤りやすいポイント

  • Java標準ライブラリのStringEscapeUtilsやURLEncoderと混同してしまう。問題文は「定義されているメソッド」と述べているため、自前実装のescapeHTMLを指す。
  • URIのエスケープとHTMLのエスケープを混同する。escapeHTMLは “HTMLテキストの入力を許可しない” 方針を補強するもので、URI正当性確認(表1③)とは別対策である。
  • 「図1で使われているから図3でも同じだろう」と暗記的に判断しがちだが、論拠は “XSS対策として統一したエスケープ処理を再利用する” ことにある。

FAQ

Q: escapeHTMLとURLEncoder.encodeは何が違いますか?
A: 前者は <、>、&、"、' などを < や & に変換してHTML内で無害化します。後者はURLエンコードであり、空白を %20にするなどの目的が異なります。
Q: JavaScript文字列用のエスケープは別に必要ですか?
A: 必要です。JavaScriptの文脈に出力する場合は \ によるエスケープやJSONエンコードが求められます。escapeHTMLはあくまで “HTMLコンテキスト” 専用です。
Q: エスケープ以外にXSSを防ぐ方法は?
A: ホワイトリストによる入力バリデーション、Content Security Policy(CSP) の適用、クッキーにHttpOnly属性を付与など複数の防御層を重ねるのが推奨されます。

関連キーワード: クロスサイトスクリプティング、エスケープ処理、URI検証、ホワイトリスト、Content Security Policy

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔プログラムの修正〕について、(1)〜(7)に答えよ。

問題文を見る
(5)本文中のhに入れる適切な行番号を答えよ。

模範解答

h:26

解説

解答の導き方

まず診断結果から何を探すべきかを決めます。図2に「実施項目:③ 実施状況:不合格 備考:URI属性出力に対しては制限が必要である。」とあるため、図4のどこかに「URL(URI属性)を出力しているが、'http://' または 'https://' の制限を行っていない箇所」があるはずです。
図4の該当箇所を順に追います。サーバ側で検索結果のoptionを生成している行には 「out.print(" <option label="" + escapeHTML(rsName) + "" value="");」
「out.println(escapeHTML(rsUrl) + "">" + escapeHTML(rsText) + "</option>");」 とあり、ここでデータベースのrsUrlをvalue属性に出力していることが分かります。出力はescapeHTMLによるエスケープしか行っておらず、URLスキームの検査('http://' または 'https://' の確認)は行われていません。
クライアント側の動きを見ると、選択されたoptionの値をhiddenフィールドに移す処理はsetValue関数内で行われています。該当の出力行には 「out.println(" document.form1.url.value =");」
「out.println(" document.form1.menu1.options[index].value;");」
「out.println(" document.form1.name.value =");」
「out.println(" document.form1.menu1.options[index].label;");」 とあり、選択されたoptionのvalueがdocument.form1.url.valueに、labelがdocument.form1.name.valueに代入されます。ここで重要なのは、ブラウザはHTML属性中のエンティティを復号してDOMのプロパティ(options[index].value / .label)を返すため、サーバ側でescapeHTMLによりエンティティ化してあっても、クライアントで取得される値は元の(復号された)文字列になる点です。なお問題文にある注記では、escapeHTMLは「HTMLの特殊文字5文字(<、 >、 &、 "、 ')のエスケープ処理を行うメソッド」と定義されており、スキーム部分(例えば "javascript:")は変化させません。
最後に、SelectWin側の出力を見るとリンクは 「out.print ("<a href=""+ escapeHTML(rqUrl) + "">");」 で作られています。つまりクライアントから送られたrqUrlは再びescapeHTMLされてhrefに出力されますが、escapeHTMLはスキーム(javascript: など)を除去しないため、もし元のrsUrlに "javascript:..." が含まれていれば、最終的にブラウザがそのhrefを解釈してスクリプトが実行され得ます。したがって問題は「エスケープだけでは不十分で、URLのスキームを許可するかどうかを検査(ホワイトリスト化)していない」ことにあります。
図4のどの行がこの不足を表しているかを照合すると、setValueによりoptionの値をhiddenに移す箇所(setValueのブロック、図4の行22~27)に該当します。問題文の空欄 h はそのブロック内の文を指しており、図4の該当行は26行目です(図中でsetValue内の代入文を出力している行が26行目にあたります)。よって h に入る行番号は26です。

誤りやすいポイント

  • escapeHTMLをしていれば安全と考える誤り:escapeHTMLは <、>、&、"、' をエスケープするが、URIスキーム(javascript: 等)を無効化しないため、リンク先のスキーム検査は別途必要です。
  • サーバ側のエスケープだけで十分と考える誤り:ブラウザは属性値のエンティティを復号してDOMプロパティとして返すため、クライアントでの操作(options[index].value取得→hiddenへ代入)により元の(危険な)文字列が流れる場合があります。
  • 「optionの表示テキストだけが問題」と見落とす誤り:value属性に悪意あるURLを入れられると、ユーザ操作経路を通じて実際にhrefに使われてしまいます。
  • 修正箇所を「出力側だけ」または「受信側だけ」に限定してしまう誤り:安全対策は出力時の検証(サーバ側)と、必要なら受信後の再検証の両方で行うべきです。

FAQ

Q: escapeHTMLを使っているのになぜ問題になるのですか?
A: escapeHTMLはHTMLの特殊文字をエスケープするだけで、URIスキーム(例えば "javascript:")を取り除きません。ブラウザは属性値のエンティティを復号してDOMの値を返すため、最終的に危険なスキームがhrefに入る可能性があります。
Q: 修正はどこで行えばよいですか?
A: 原則はサーバ側で出力時に検証することです。具体的にはrsUrlを出力する前に「http:// またはhttps:// で始まるか」を確認して、合致しなければ出力しないか安全な代替(# や空文字)にする、あるいは明示的に安全なスキームを付与するなどのホワイトリスト方式を実装します。クライアント側の追加チェックは補助であり、サーバ側検証を必須としてください。
Q: 代替の安全策として何が良いですか?
A: URLを正規化してスキームをパースし、許可リスト(http/httpsのみ)に合致するか確認すること。さらに、出力時は属性値として適切にエスケープし、ユーザが外部リンクを開く場合はtargetなどで安全対策を施すこと(例:rel="noopener noreferrer"。ただしこれはXSS対策そのものではなく補助策です)。

関連キーワード: クロスサイトスクリプティング、HTMLエスケープ、URLスキーム、DOMプロパティ、ホワイトリスト

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔プログラムの修正〕について、(1)〜(7)に答えよ。

問題文を見る
(6)本文中のiに入れる最も適切な実施項目を表1の②〜⑥から選び答えよ。

模範解答

i:④

解説

解答の論理構成

  1. 問題文は、図4のプログラムにおける h行目 の対策不足を指摘し、表1のいずれの実施項目に該当するかを問うています。
  2. 表1でスクリプト要素に関する対策を示しているのは「④ スクリプト要素の内容(“<script>…</script>” の “…” 部分)を動的に生成しない。」です。
  3. 図4では <script type="text/javascript"> ~ </script> の間でJavaからout.printlnによりJavaScriptコードを逐次生成しており、h行目 はその一部です。すなわちスクリプト要素の“…”をサーバ側で動的生成している典型的な例で、実施項目④が要求する「動的に生成しない」という方針に反します。
  4. したがって i に入るべき実施項目は「④」です。

誤りやすいポイント

  • エスケープ処理(実施項目②)が入っているため安全と早合点しやすい。実装場所が <script> 内か否かを必ず確認する必要があります。
  • 実施項目③「URL制限」と取り違えるケースが多い。h行目 ではURIではなくスクリプト本体を生成しているため③ではありません。
  • 「動的に生成しない」の解釈を“JavaScriptを使わない”と誤読しやすい。ポイントはHTML生成段階でスクリプト断片をサーバ側で組み立てない設計(外部 .jsや定数文字列化)にあります。

FAQ

Q: エスケープしていれば <script> 内で動的生成しても問題ないのでは?
A: スクリプト要素の中はJavaScriptとして解釈されるため、文字列結合や改行位置の違いで意図せずコードが実行される危険があります。IPAが示す「④」は根本的にサーバ側でスクリプトを組み立てない設計を推奨しています。
Q: 実施項目④を満たす具体的な方法は?
A: スクリプトは外部ファイル(.js)に静的に記述し、動的値はDOM操作やデータ属性で受け渡す方法が推奨です。テンプレートエンジンを使う場合も同様にサニタイズ済みプレースホルダを適用し、サーバ側で直接JavaScriptを連結しない設計にします。
Q: URI制限(実施項目③)とどう区別すればよい?
A: ③はhref・srcなど「URI属性」に埋め込む値を制限する対策、④は <script> 要素そのものの “… 部分” をサーバ側で生成しない対策です。生成場所がURI属性かスクリプト本体かで判断します。

関連キーワード: クロスサイトスクリプティング、JavaServlet, エスケープ処理、コンテントセキュリティ、スクリプトインジェクション

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:〔プログラムの修正〕について、(1)〜(7)に答えよ。

問題文を見る
(7)本文中のjに入れる適切な修正後の1行のソースコードを答えよ。

模範解答

j:out.print("document.form1.loc.value");

解説

解答の論理構成

  • 【問題文】図4のJavaScriptでは、次のように スクリプト要素の内容を動的に生成しています。
    ・out.println(" document.form1.msg1.value = "" +
    ・out.println(" document.form1.menu1.options[index].text;");
    ここで + escapeHTML(rqLoc) + の部分にリクエストパラメータが挿入されるため、表1の実施項目 ④「スクリプト要素の内容(…)を動的に生成しない。」 に抵触します。
  • 表示したい “[ 地区名 ]” は、すでに <input type="hidden" name="loc" …> に escapeHTML(rqLoc) で埋め込まれているので、スクリプトの中で再度リクエストパラメータを連結する必要はありません。
  • したがって、JavaScriptは フォーム部品から値を取得するだけ に書き換えれば動的生成を回避できます。
  • 具体的には、onSet() 内で “[ 地区名 ]” を 'document.form1.loc.value' から取得するようにし、Java側の出力文を1行だけ修正します。
java out.print("document.form1.loc.value");
  • これにより
    ① リクエストパラメータを直接スクリプトに書き込まない
    ② HTML側で既にエスケープ済みの値を利用できる
    という2点が同時に達成され、表1実施項目 ④ に適合する修正となります。

誤りやすいポイント

  • 「エスケープしているから安全」と思い込み、動的JavaScript生成そのものの危険性(表1 ④)を見落とす。
  • out.printlnのまま改行付きで出力し、余計な文字や区切り記号を入れてしまう。
  • locフィールドではなくmsg1やurlなど別の要素名を参照してしまい、スクリプトが正常に動作しなくなる。

FAQ

Q: どうしてescapeHTML(rqLoc) をJavaScriptに直接書いてはいけないのですか?
A: 表1の実施項目「④」にあるように、スクリプト要素の内容を動的生成するとブラウザがスクリプトとして解釈してしまう可能性が残ります。フォーム部品の値を参照すればHTML部分で一度エスケープされたデータを再利用でき、安全性が高まります。
Q: out.printとout.printlnの違いはセキュリティに影響しますか?
A: 行末の改行が付くかどうかだけなのでセキュリティ上の差はありません。本問では可読性を保つ目的でout.printを用いています。
Q: 隠しフィールドlocにXSSのリスクはありませんか?
A: 隠しフィールドに値を書き込む時点でescapeHTMLがかかっているため、HTML特殊文字は無害化済みです。スクリプトでは単に値を読むだけなので追加の対策は不要です。

関連キーワード: クロスサイトスクリプティング、エスケープ処理、URI制限、動的スクリプト生成、隠しフィールド

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

情報処理安全確保支援士を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について