CORSの実装と複数オリジンへの対応【情報処理安全確保支援士試験 平成31年度 春期 午後1 問1 設問3】

情報処理安全確保支援士試験 平成31年度 春期 午後1 問1 設問3

問1 Webサイトのセキュリティに関する次の記述を読んで、設問1〜3に答えよ。

(略)

f:id:aolaniengineer:20200508042719p:plain

(略)

f:id:aolaniengineer:20200508042806p:plain

(略)

【CORSを利用した実装】

 Cさんは、スクリプトZの実装にCORSを用いたときの一連の動作を検討し、表1にまとめた。

f:id:aolaniengineer:20200510042433p:plain

f:https://site-a.m-sha.co.jp

CORSの実装について、図3(一連の動作)を具体的な実装に示したものが、表1になります。

 図3の「test1.example.com」「test2.example.com」が、それぞれ表1の「WebサイトA」「WebサイトB」に該当します。

 表1のNo.4は、図3の(ⅸ)レスポンスに該当し、ヘッダ情報は図5に示されていることがわかります。

 図5の注1に「Access-Control-Allow-Originには、Webサイトが許可するオリジンが返される」とあります。

 オリジンの値が何かを表1で探すと、No.3に「・・Originヘッダフィールドには”https://site-a.m-sha.co.jp”が設定されている。」とあります。

 したがって、Access-Control-Allow-Originヘッダフィールドの値は、”https://site-a.m-sha.co.jp”となります。

g:売れ筋商品情報配信の申込ページのオリジン

 Access-Control-Allow-Originヘッダフィールドの値は前問の通り、”https://site-a.m-sha.co.jp”ですが、これはWebサイトBが許可したオリジンです。

 この値と照合すべき値としては、Webブラウザがアクセス許可を申請したオリジンであるプリフライトリクエストのオリジン、つまり、売れ筋商品情報配信の申込ページのオリジンになります。

 したがって正解は以下の通りです。(複数の解答候補があると思います)

「売れ筋商品情報配信の申込ページのオリジン」

「WebサイトAのオリジン」

「プリフライトリクエストのOriginヘッダフィールドの値」

 Cさんは、表1についてD課長に確認した。次は、その時のD課長とCさんの会話である。

D課長:今後、他のシステムでもCORSを利用することが考えられるので、コーディング規約も併せてまとめておきたい。Access-Control-Allow-Originヘッダフィールドに指定できるオリジンは一つだけなので、複数のオリジンからのアクセスを許可するような仕様であった場合に、No.4の内容では不十分である。WebAPIのプログラム内に、許可するオリジンのリストを用意しておく必要がある。プリフライトリクエスト又はメインリクエストがWebAPIに送られてきたときに、そのリクエスト中の(h:Originヘッダフィールドの値)を、(i:許可するオリジンのリスト)と突合し、(j:一致)した値があればその値をAccess-Control-Allow-Originヘッダフィールドに設定するという内容もコーディング規約に含めればよいだろう。

Cさん:分かりました。

h:Originヘッダフィールドの値i:許可するオリジンのリストj:一致

 複数のオリジンからのアクセスを許可するための対応方法を考えます。

 WebAPIのプログラム中に許可するオリジンのリストを用意するとのことなので、リクエストとして受信する「Originヘッダフィールド」の値と、そのリストを突合すれば、複数のオリジンからのアクセス認可処理することができそうです。

 Cさんは、CORSの利用に関するコーディング規約をまとめ、表1をこれに合うように修正し、D課長に再度確認した。修正後の内容で問題ないということだったので、Cさんは実装を行なった。

 その後、セキュリティ専門業者に脆弱性診断を依頼し、脆弱性が検出されないことを確認した上で、情報連携機能をリリースした。その後、同様に残り四つのブランドサイトからWebサイトAへの情報連携機能も実装した。

【出典:情報処理安全確保支援士試験 平成31年度 春期 午後1問1(一部、加工あり)】