Same Origin PolicyとCORSとCPS

一度きちんと整理しておきたし。

オリジンとは

URLのscheme, host, portによって定義される。以下、いずれも違うオリジンになる。

同一生成元ポリシー

英語で言うと、Same Origin Policy。 http://www.w3.org/Security/wiki/Same_Origin_Policy を読むと、いきなり"There is no single same-origin policy." と書かれている。。。が、一般原則はある。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Same_origin_policy_for_JavaScript によれば、

  • 異なる生成元への書き込みは、概して許可されます。例えばリンク、リダイレクトやフォームの送信です。まれに使用される HTTP リクエストでは、プリフライトが必要です。
  • 異なる生成元の埋め込みは、概して許可されます。例は後述します。
  • 異なる生成元からの読み込みは概して許可されませんが、埋め込みによって読み込みアクセスはしばしば漏れ出します。例えば埋め込み画像の幅や高さ、埋め込みスクリプトのアクション、あるいは埋め込みリソースで可能なものを読み取ることが可能です。

とのこと。

CORS(Cross Origin Resource Sharing)

通常、XMLHttpRequest オブジェクトにより発行された HTTP リクエストは 同一生成元ポリシー (same-origin policy) の制約を受けるが、これを緩和する方法を規定したのが、CORS

クロスサイトHTTPリクエストを受ける側が、許可するオリジンを設定する。 シナリオは https://developer.mozilla.org/ja/docs/HTTP_access_control#Simple_requests が分かりやすい。

CSP(Content Security Policy)

https://developer.mozilla.org/ja/docs/Security/CSP/Introducing_Content_Security_Policy からそのまま抜粋すると...

Content Security Policy (CSP) は、クロスサイトスクリプティング (XSS) やデータインジェクション攻撃を含む、よく知られた種類の攻撃を検出して軽減する、セキュリティの追加レイヤーです。これらの攻撃手法は、データ窃盗からサイト改変、マルウェア感染まで、すべてに使用されます。

CSP は、実行可能なスクリプトの提供元が検証されていることをブラウザが判別するためのドメインを指定することによって、サーバ管理者が XSS の要因を減らし根絶できるようにします。CSP 互換のブラウザは、ホワイトリストに含まれたドメインから受信したスクリプトだけを実行し、その他のスクリプト (インラインスクリプトやイベントを扱う HTML 属性を含む) をすべて無視します。

CORSとは異なり、クロスサイトHTTPリクエストのオリジン側が設定する。 ディレクティブもかなり細かい。

  • default-src
  • script-src
  • img-src
  • style-src
  • etc

よくわからないこと

あとで調べたい。

  • CSPってどのブラウザでも大抵サポートされてるっけ?
  • Chromehttps通信だと、別オリジンのimageが読み込めない(たしか)だが、CSPを設定すれば読めるのかしら。。試してみたところオリジンかどうかじゃなくて、httpなリソースの読み込みに制約があるという話のようだ。

外部ファイルの読み込み制約

下記htmlドキュメントをexample.comに置き、httpsでリクエストしてみました。*1

chrome(v34.0)
external file on http on https
js NG OK
css NG OK
image OK OK

f:id:kotaroito2002:20140418124736p:plain

safari(v6.0.5)
external file on http on https
js OK OK
css OK OK
image OK OK

f:id:kotaroito2002:20140418124742p:plain

*1:もちろんexample.comそのものには置けないのでhostファイルをごにょごにょしてます