KEEP LEARNING

アウトプット至上主義

Web APIの設計大丈夫?

f:id:food_blog:20200607230112p:plain 

本記事ではセキスペ 過去問(H.31/春 午後I 問1)を例題として解説する中でWebAPIの理解を深めます。

※IPA公式サイトから実際の問題を使用しております。 

 

1.前提知識

  • クロスドメイン通信
  •  WebAPI

 

2.知識のインプット

 

Same-Originポリシ(同一生成元ポリシ)

あるオリジンから読み込まれた文書やスクリプトについて、そのリソースから他のオリジンのリソースにアクセスできないように制限する規約。

 

CSRF(クロスサイトリクエストフォージェリ)

ユーザがログイン状態を保持したまま悪意のある第三者の作成したURLをクリックした場合などに、本人が意図しない形で情報、リクエストが送信されてしまうこと。

SNS等のログイン情報を利用して、勝手に投稿されてしまう等の被害が少なくない。

 

CORS(Cross-Origin Resource Sharing)

Same-Originポリシの制限を解除し、指定したオリジン間に限りリソースの共有を許可するための仕組み

 

JSONP(JSON with padding)

クロスサイト環境で他のオリジンから、JSONデータを取得するために考案された仕組み

HTMLのスクリプトタグはSame-Originポリシの制限を受けないという点を利用して異なるオリジンのデータを取得する

あくまでテキスト(JSON)ではなくスクリプトファイルを読み込んでCallbckで指定した関数を実行してJSONデータを取得します。

 

 

 

3.背景

 

Webサービスには、Webブラウザから利用するものだけでなく、サービスの機能の一部をプログラムからWebAPIとして利用するものもある。

webサイトから読み込まれたスクリプトが異なるオリジンのWebAPIにアクセスする場合、Same-Originポリシによって制限される。CORSを利用すれば制限を回避することができるが、セキュリティを考慮して実装する必要がある。

WebAPIを設計する能力を問う

 

4.過去問の要約

 

M社は小売業を営んでおり、コーポレートサイトAと自社の特定ブランドを取り扱うECサイトを複数経営している。

WebサイトBではCookieを利用したセッション管理を行なっている。会員情報は、各ブランドサイトで個別に管理している。

WebサイトBではWebサイトAへ売れ筋情報、会員情報を連携するためにWebAPIを実装している。WebAPIで受け渡されるデータはJSON形式、会員情報の取得はWebブラウザを経由して取得する。

 

f:id:food_blog:20200605093820p:plain

スクリプトZはSame-Originポリシによって、FQDNスキームポート番号のいずれかが異なるリソースへのアクセスが制限される。そこで、この制限を開始するためにJSONPを用いることを検討した。

 

JSONPはアクセス制限する機能をもたいので、その実装では問題がある。例えば、まず会員情報を搾取するような攻撃者がスクリプトZを変更して、攻撃者のWebサイトページに置く。次に、被害者に特定の操作をさせた上で、そのページにアクセスさせると、攻撃者が被害者の会員情報を搾取できてしまう。

 

次に、JSONPの代わりにCORSを用いることを検討した。

f:id:food_blog:20200605131506p:plain

 

f:id:food_blog:20200605133004p:plain

また、CROSでは通常、Webブラウザはスクリプトを読み込んだページのオリジンだけにCookieや、ベーシックの認証情報を送る。図2では設定指定ないが、XMLHttpRequestのプロパティのwithCredentialsの値がtrueに設定されている場合、図3であればの動作の際に、test2.example.comから発行されたCookieが送られる

 

f:id:food_blog:20200605134342p:plain

プリフライトリクエスト又はメインリクエストがWebAPIに送られてきたときに、そのリクエストの中のOriginヘッダフィールドの値を許可するオリジンのリストと突合し、一致した値があればその値をAccess-Control-Allow-Originヘッダフィールドに設定するという内容もコーディング規約に含めれば良い

 

5.解説

 

被害者に特定の操作をさせた上で 

 図の注記からWebサイトAへで売れ筋商品の出力はWebサイトBへのログイン状態のときにのみ出力されることがわかります。

WebサイトBではCookieを利用して認証状態のセッション管理をしているのでWebサイトBにログインする操作を被害者にさせた上で偽のWebサイトに誘導しCookieを搾取することで会員情報を搾取できてしまいます。