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

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


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

   E社は、提携店舗数100店の賃貸不動産仲介業者である。E社では、3年前に開設したWebシステム(以下、Eシステムという)を用いて賃貸物件情報を提供している。Eシステムの運用はシステム部が担当し、Eシステムの保守とコンテンツの開発はEシステムの開発を担当したB社に委託している。  E社は、Eシステムをインターネットに公開することを踏まえて、IPAが公表している“安全なウェブサイトの作り方”のチェックリストを参考にしてセキュリティ対策の実施項目を作成し、その実施項目に従ってJavaで開発するようB社に依頼していた。対策の実施項目のうち、クロスサイトスクリプティング(以下、XSSという)対策の実施項目を、表1に示す。
情報処理安全確保支援士試験(平成25年度 午後1 問01 表01)
〔社内検査〕  Eシステム開発後、他社のWebサイトでXSS対策漏れが原因の事故が多発したことから、Eシステムにも問題が潜在していることが魅念された。そこで容易に検査できる方法はないかと探していたところ、基本的なXSS対策を実施しているかどうかを診断する“ウェブ健康診断仕様”(以下、Web健康診断という)が、“安全なウェブサイトの作り方”の別冊としてIPAから公表されているとの情報を得た。表2はWeb健康診断に基づいて作成したXSS対策の判定基準である。システム部のC部長は、表2の内容であれば、社内で検査できると考え、若手のD君を担当に指名した。  表2の判定基準では、“対象画面”の“検査文字列を入力する場所”に“入力する検査文字列”を入力した場合に、“脆弱性ありと判定する基準”で示された基準で脆弱性ありと判定する。
情報処理安全確保支援士試験(平成25年度 午後1 問01 表02)
 図1はEシステムのうち、賃貸物件の選択結果を表示するプログラムである。D君が表2の判定基準に基づいて検査をしたところ、検出パターンaの検査で脆弱性ありと判定された。その原因箇所は図1のプログラムのb行目であった。図1に、他の脆弱性ありと判定されたものはなかった。
情報処理安全確保支援士試験(平成25年度 午後1 問01 図01)   〔詳細な診断の受診〕  表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: パラメタ値がそのまま などに入る場合はどの実施項目で防ぐのですか?
A: 出力先が URI 属性であれば③でスキームを制限し、同時に②でエスケープ処理も行います。基本は多層防御です。
Q: escapeHTML を使っても XSS が防げない場面はありますか?
A: JavaScript 内文字列や CSS コンテキストなど、HTML エスケープでは不十分な場所があります。適切なコンテキストエスケープを使う必要があります。

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

設問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 を タグの 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エスケープ

設問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属性、ホワイトリスト

設問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属性

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

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

模範解答

c:17 d:24

解説

解答の論理構成

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

誤りやすいポイント

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

FAQ

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

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

設問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 + "");
    いずれもデータベースから取得した文字列 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出力、入力値検証、凡例属性

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

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

模範解答

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

解説

解答の論理構成

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

誤りやすいポイント

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

FAQ

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

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

設問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

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

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

模範解答

h:26

解説

解答の論理構成

  • 【図4】の 22〜27 行は、フォームの hidden フィールドへ値を設定する JavaScript をサーブレット内で生成しています。
  • うち 26 行目には
    out.println(" document.form1.menu1.options[index].label;");
    とあり、options[index].label(利用者に提示する物件名)を そのまま hidden フィールド name にコピーしています。
  • 表1「② Webページに出力する全ての要素に対して、エスケープ処理を施す。」では、画面に再表示されるあらゆる文字列に HTML エスケープをかけることを求めています。
  • この hidden フィールドは再び【図1】で
    out.print (" [ " + escapeHTML(rqLoc) + " ] ");
    out.println(escapeHTML(rqName) + "");
    と画面表示に使用されますが、26 行目ではエスケープが行われていないため、"
  • したがって、表1実施項目②に対して対策が不十分である行は 26 行目となります。

誤りやすいポイント

  • JavaScript 内だから安全と思い込み、サーバ側で作るスクリプト文字列に利用者入力を直接入れてしまう。
  • hidden フィールドは「画面に見えない」ため安全と誤解し、値のサニタイジングを忘れる。
  • escapeHTML を一度使ったらその後の処理でも安全と決めつけ、データの流れ全体を確認しない。

FAQ

Q: hidden フィールドは画面に表示されないのに、なぜエスケープが必要なのですか?
A: フォーム送信後の別画面で再利用されるためです。表示フェーズでサニタイズされていなければ XSS が発生します。
Q: options[index].label はサーバ側で escapeHTML(rsName) 済みなのでは?
A: HTML エンティティとしてエスケープされても、JavaScript が値を取得する時点ではプレーンテキストに戻り、< や > が現れる可能性があります。
Q: JavaScript 内に取り込む値は escapeHTML で十分ですか?
A: JavaScript 文字列としてのエスケープ(引用符やバックスラッシュなど)も必要です。用途ごとに適切なエスケープ関数を使い分けることが重要です。

関連キーワード: クロスサイトスクリプティング、エスケープ処理、hiddenフィールド、JavaScriptインジェクション、入力値検証

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

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

模範解答

i:④

解説

解答の論理構成

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

誤りやすいポイント

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

FAQ

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

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

設問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制限、動的スクリプト生成、隠しフィールド
戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する

すぐに利用可能!

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

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