[4] [DFN[[RUBY[同一起源方針] [どういつきげんほうしん] [same origin policy]]]]は、 [[Web]] において、[[スクリプト]]が異なる[[起源]] (一般には[[ドメイン]]) に由来する[[物体]]に対してアクセスすることを制限する[[安全性]]に関する方針です。 ;; [55] たまに [DFN[[[SOP]]]] と略されることがあります。 * 仕様書 [REFS[ - [5] '''[CITE@en[RFC 6454 - The Web Origin Concept]] ([TIME[2011-12-12 09:13:37 +09:00]] 版) ''' - [3] [CITE@en-US-x-hixie[HTML 5]] ([TIME[2008-07-04 05:49:35 +09:00]] 版) ]REFS] * 同一起源方針の原理 [56] [[Webアプリケーション]]は、[[鯖]]が提供した[[スクリプト]]等を [[Webブラウザー]]上の環境において実行、 評価するものですが、適切な[[セキュリティー・モデル]]が無ければ[[利用者]]やその他の人が意図しない有害な動作がなされてしまうかもしれません。 [[同一起源方針]]は [[Webブラウザー]]上で動作する[[Webアプリケーション]]のための[[セキュリティー・モデル]]として発展、収束してきたものです。 [[RFC 6454]] で [[Adam Barth]] は次の基本原理をまとめています。 - Trust - Origin - Authority - Policy ** Trust [57] [[同一起源方針]]においては [[URL]] によって [[trust]] を指定していると言えます。 [EG[ [58] 例えば [CODE(HTMLe)@en[[[script]]]] [[要素]]によって [[URL]] を指定して外部の[[スクリプト]]を読み込むことは、 自身の持つ[[特権]]を当該 [[URL]] に対して付与していることになります。 つまり当該 [[URL]] から得られる情報の[[一貫性]]を信頼 (trust) すると宣言していると言えます。 ]EG] [EG[ [59] また [CODE(HTMLe)@en[[[form]]]] [[要素]]によって [[POST]] 先の [[URL]] を指定することは、秘密のデータを当該 [[URL]] に対して開示することになります。 つまり当該 [[URL]] に送られるデータの秘匿性を信頼 (trust) すると宣言していると言えます。 ]EG] ** Origin [60] あらゆる [[URL]] にそれぞれ個別の保護された領域を与えることもできますが、 それでは実用上不便なので、[[同一起源方針]]にあっては[[ドメイン]]などが共通する [[URL]] 群を [[起源]] (origin) と呼び、これを保護の単位とします。 [EG[ [61] 例えば [CODE(URI)@en[http://example.com/]] と [CODE(URI)@en[http://example.com/~mypage/]] は [CODE(URI)[http://example.com]] という共通の[[起源]]を持ちます。しかし [CODE(URI)[http://www.example.com/]] や [CODE(URI)@en[http://example.com:8080/]] の[[起源]]はそれぞれ [CODE(URI)[http://www.example.com]] や [CODE(URI)@en[http://example.com:8080]] であり、異なります。 ]EG] ** Authority [62] [[起源]]が同じであっても、[[資源]]はそれぞれの権限 (authority) を持っています。 どれだけの権限を与えるかは [[MIME型]]により決まります。 [EG[ [63] 例えば [CODE(MIME)@en[[[image/png]]]] の[[資源]]は[[画像]]であり、 [[API]] その他へのアクセス権を有しません。一方 [CODE(MIME)@en[[[text/html]]]] の[[資源]]は [[HTML文書]]であり、[[スクリプト]]の実行その他の様々な権限を有します。 ]EG] ** Policy [64] [[同一起源方針]]においては[[起源]]はそれぞれ別に管理されており、他の[[起源]]との通信は制限されています。 他の[[起源]]の[[API]]アクセスは原則として禁止されていますし、他の[[起源]]の[[資源]]を読み取ることもできません。 他の[[起源]]に情報を送ることは認められていますが、一部の決められた形式に制限されています。 [EG[ [65] 例えば [[DOM]] の [[API]] によって他の[[起源]]の[[文書]]にアクセスすることはできません。 [CODE(DOM)@en[[[postMessage]]]] など例外はありますが、それ以外は [[Webブラウザー]]により厳密に管理されています。 ]EG] [EG[ [66] [[XHR]] によって他の[[起源]]の[[資源]]を読み取ることは、 [[CORS]] により例外的に認められていない限り、 禁止されています。 ]EG] * 適用対象 [9] @@ このリストは不完全です。 -[20] [CODE(DOMa)@en[[[window]]]] や [CODE(DOMa)@en[[[document]]]] や [CODE(DOMa)@en[[[location]]]] の[[メンバー]] (一部例外を除きます。) に対する[[スクリプト]]からのアクセス [SRC@en[[[HTML 5]]]] --[26] ただし、[[Webブラウザ]]によっては、 [[HTML 5]] で例外とされている[[メンバー]]以外にも異なる[[起源]]の[[スクリプト]]からアクセスできてしまいます。 (例えば [[Gecko]] では [CODE(DOMa)@en[[[name]]]] や [CODE(DOMa)@en[[[status]]]] にアクセスできます。 [CODE(DOMa)@en[[[name]]]] の項を参照。) -[23] [[CSSOM]] へのアクセス [SRC[仕様なし]] - [33] 外部資源へのアクセス --[21] [CODE(DOMi)@en[[[XMLHttpRequest]]]] による[[外部資源]]へのアクセス [SRC@en[[[XMLHttpRequest]], [[XMLHttpRequest]] 2]] --[22] [[WebSocket]] による接続 [SRC@en[[[HTML 5]]]] --[31] [CODE(DOMi)@en[[[Document]]]] [[オブジェクト]]の [CODE(DOMm)@en[[[load]]]] で読み込める [[URL]] [DEL[([[MSXML]]、[[Gecko]] など; [[DOM3LS]] [[CR]] にあったが同一起源方針に関する仕様はなし)]] [SRC[>>71]] --- [71] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) -- [34] [[XSLT]] [CODE(XPathf)@en[[[document()]]]] [[関数]]による別[[起源]]の[[資源]]へのアクセス [SRC[仕様なし]] -[37] [CODE(DOMa)@en[[[mozIsLocallyAvailable]]]] - [43] [[SOAP]] -- - [73] [CODE(DOM)@en[[[onerror]]]] -- [CODE(HTMLe)@en[[[iframe]]]]: [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [74] [CODE(HTMLa)@en[[[seamless]]]] -- [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [77] [CODE(HTMLe)@en[[[canvas]]]] の[[起源汚染]] -- [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [75] [[Web Fonts]] の利用 -- [76] [CODE(DOMm)@en[[[measureText]]]] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [78] [CODE(HTMLa)@en[[[autofocus]]]] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [80] [CODE(HTMLa)@en[[[ping]]]] [[要求]] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) * 起源の値によって動作が変わるもの - [68] [[fetch]] において [CODE(HTTP)@en[[[Referer:]]]] を送出する条件 -- [[起源]]が[[3項組]]で''なければ''、 [CODE(HTTP)@en[[[Referer:]]]] を送っては[['''なりません''']] [SRC[>>67]]。 -- [67] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [70] [CODE(JS)@en[[[document.cookie]]]] を使える条件 -- [[起源]]が[[3項組]]で''なければ''、 [CODE(JS)@en[[[document.cookie]]]] には読み書きできません [SRC[>>69]]。 -- [69] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) - [79] [[ダウンロード]]時の[[ファイル名]] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-02-22 20:11:59 +09:00]] 版) * 適用対象外 [10] 歴史的な理由により、次の場合には同一起源方針は適用されません。 - [CODE(HTMLa)@en[[[src]]]] [[属性]]、 [CODE(HTMLe)@en[[[object]]]] [[要素]]、 [CODE(HTMLe)@en[[[embed]]]] [[要素]]、 [CODE(HTMLe)@en[[[link]]]] [[要素]]などによる外部[[資源]]の埋め込み -- [CODE(HTMLe)@en[[[img]]]] [[要素]]や [CODE(HTMLe)@en[[[iframe]]]] [[要素]]など -- [CODE(HTMLe)@en[[[script]]]] [[要素]]による外部[[スクリプト]]の参照も含みます。 これがそもそも設計上の意図的なものなのか、設計ミスなのかはわかりませんが、 [[JSONP]] などで同一起源方針を擦り抜けるテクニックとしてよく利用されています。 -- これらの[[要素]]や[[属性]]を使うと、本来[[スクリプト]]から取得できないべきである、 異なる[[起源]]の情報を取得することができてしまいます。前述のスクリプト実行だけでなく、 例えば、[[画像]]の大きさを取得することで、その内容を推測できてしまうかもしれません。 -- 外部[[スタイル・シート]]については、非同一起源でも読み込まれて文書に適用されますが、 [[スクリプト]]による [[CSSOM]] の参照に関しては同一起源方針の適用対象になります (ただし各[[ブラウザ]]とも動作が怪しい)。 -- 外部 [[CSS]] [[スタイル・シート]]中の [CODE(CSS)@en[[[expression]]()]] - [[画像]]系 [[CSS]] [[特性]]による外部[[画像]]の埋め込み - [CODE(CSS)@en[[[-moz-binding]]]] [[特性]]による外部 [[XBL 1.0]] [[文書]]の読み込み - [CODE(CSS)@en[@[[import]]]] による外部 [[CSS]] [[スタイル・シート]]の[[輸入]] - [[Webフォント]] -- 一部ブラウザ実装。今後の動向次第で変更される可能性あり。 -[18] [[Cookie]] -- [CODE(HTTP)@en[[[Set-Cookie]]:]] [[頭欄]]内で発行対象の[[ドメイン]]を指定できます。 -- [CODE(JS)@en[[[document.cookie]]]] を使っても書き込みできます。 -[25] [CODE(DOMm)@en[[[postMessage]]]] [[メソッド]]を使うと、 異なる[[起源]]の [[Web頁]]に対して文字列を伝達できます。 -[32] [CODE(HTMLa)@en[[[marginwidth]]]] など[[フレーム]]内の[[余白]]を設定する[[属性]]を使うと、 [[フレーム集合文書]]とは異なる[[起源]]の[[フレーム]]内[[文書]]の[[余白]]を設定できます。 -- [[フレーム]]は [[CSS]] によるレンダリング・モデル以前に実装された歴史的経緯によります。 - [38] [CODE(JS)@en[[[window.name]]]] - [39] [CODE(HTMLa)@en[[[marginheight]]]], [CODE(HTMLa)@en[[[marginwidth]]]] [16] 要確認: - [[XSLT]] [[スタイル・シート]] * [11] 制約の緩和 - [15] [CODE(JS)@en[[[document]].[[domain]]]] [[DOM属性]]に値を設定することにより、 [[起源]]となる[[ドメイン名]]を変更することができます。 --ただし、新しい[[ドメイン名]]は元の[[ドメイン名]]の上位階層に当たるものでなければなりません。 - [12] [[CORS]] により、''外部[[資源]]は''、異なる[[起源]]からのアクセスを許可することができます。 -- [13] [[Microsoft]] が提案し、 [[WinIE 8]] で実装している [CODE(DOMi)@en[[[XDomainRequest]]]] を用いると、 異なる[[ドメイン]]の[[資源]]にアクセスできます。 - [14] [[WinIE]] で実装されている[[セキュリティ・ゾーン]]の機能により、 [[イントラネット]]等[[ゾーン]]毎に、 [[同一起源方針]]を[[利用者]]の設定により緩和することができます。 -[17] [[Adobe]] [[Air]] は異なる[[起源]]に対する [CODE(DOMi)@en[[[XMLHttpRequest]]]] でのアクセスを可能にする [CODE(HTMLa)@en[[[allowcrossdomainxhr]]]] [[属性]]を実装しています。 -[19] [CODE(DOMa)@en[[[globalStorage]]]] --かつて [[HTML 5]] に含まれていました。 --現在は削除され、代わりに [CODE(DOMa)@en[[[localStorage]]]] が定義されていますが、 こちらは[[同一起源方針]]に完全に従っています。 -- [[Firefox]] 3 が実装しています。 -- [CODE(JS)@en[[[document]].[[domain]]]] [[DOM属性]]の設定と同じようなアクセス制約があります。 - [44] [[Gecko]] は特権を取得することで一部制限を回避できるらしい -- * 媒体 [30] [CITE[Re: Same-origin checking for media elements]] ([[Ian Hickson ]] 著, [TIME[2008-11-17 01:37:36 +09:00]] 版) * 労働者 @@ ・・・ * 局所ファイル [27] [[HTML5]] は[[局所ファイル]]に関しては[[相互運用性]]に関係しないため適用範囲外として規定していません。 [28] [CITE@ja[Chromeセキュリティモデル、IE/Firefox/Safari/Operaのいいとこ取り | エンタープライズ | マイコミジャーナル]] ([[Mainichi Communications Inc.]] 著, [TIME[2008-12-09 08:24:36 +09:00]] 版) [29] [CITE[Chromium Blog: Security in Depth: Local Web Pages]] ([TIME[2008-12-13 15:47:53 +09:00]] 版) * 歴史 [6] 同一起源方針は、 [[Netscape Navigator]] 2.0 で [[JavaScript]] と共に導入され [SRC[>>1、>>2]]、2.01 および 2.02 で不具合の修正がなされました [SRC[>>1]]。 [7] [[Internet Explorer]] をはじめとする他ブラウザも同様にこの制限を実装しましたが、 [[ECMAScript]] 仕様や [[DOM]] 仕様としての標準化の対象外とされ、 長らく明文化された規定が存在していませんでした。 [8] [[HTML DOM]] に関係する部分はようやく2005年頃に [[WHATWG]] によって [[HTML 5]] 仕様の一部として仕様の明文化が行われ始めました。 また、 [[XMLHttpRequest]] に関しては [[HTML 5]] 仕様を参照する形で規定されています。 [[#comment]] * メモ [2] [CITE[JavaScript Security: Same Origin]] ([CODE[2008-06-18 04:13:16 +09:00]] 版) [1] [CITE@en[Same origin policy - Wikipedia, the free encyclopedia]] ([CODE[2008-07-02 01:06:45 +09:00]] 版) [35] [CITE@en-us[Same origin policy for JavaScript - MDC]] ([TIME[2009-02-17 13:34:30 +09:00]] 版) [36] [CITE[The Multi-Principal OS Construction of the Gazelle Web Browser - Microsoft Research]] ([TIME[2009-03-07 00:35:15 +09:00]] 版) [[Webブラウザー]]の[[プロセス]]を[[起源]]毎に分離することによって[[保安性]]の向上を図る[[論文]]だそうです。 [40] [CITE@en[(X)HTML5 Tracking]] ([TIME[2009-09-30 00:11:40 +09:00]] 版) [41] [CITE[IRC logs: freenode / #whatwg / 20100223]] ([TIME[2010-02-25 09:03:01 +09:00]] 版) [42] [CITE['''['''whatwg''']''' Canvas 2D Context Proposal: resetOriginClean]] ([TIME[2010-04-25 01:54:34 +09:00]] 版) [45] [CITE@en[Guidelines for Web Content Transformation Proxies 1.0]] ( ([TIME[2010-10-22 17:20:31 +09:00]] 版)) [46] [CITE@en[Web Applications 1.0 r5873 Make sure cross-origin fonts can't leak data via .]] ( ([TIME[2011-02-11 10:48:00 +09:00]] 版)) [47] [CITE[Embedder's Guide - V8 JavaScript Engine - Google Code]] ( ([TIME[2010-11-13 19:00:12 +09:00]] 版)) [48] [CITE@en[draft-abarth-principles-of-origin-00 - Principles of the Same-Origin Policy]] ([TIME[2011-02-22 08:21:31 +09:00]] 版) [49] [CITE@en[Thoughts on font linking and embedding]] ( ([[Maciej Stachowiak]] 著, [TIME[2011-02-17 04:28:23 +09:00]] 版)) [50] [CITE@en[Thoughts on font linking and embedding]] ( ([[Maciej Stachowiak]] 著, [TIME[2011-02-17 04:28:23 +09:00]] 版)) [51] [CITE['''['''whatwg''']''' Canvas and drawWindow]] ([TIME[2011-03-15 13:03:35 +09:00]] 版) [52] [CITE[IRC logs: freenode / #whatwg / 20110202]] ( ([TIME[2011-03-19 11:10:11 +09:00]] 版)) [53] [CITE[IRC logs: freenode / #whatwg / 20110214]] ( ([TIME[2011-03-23 00:25:04 +09:00]] 版)) [54] [CITE[クロスドメイン通信方法のまとめ - nopnopの日記]] ( ([TIME[2011-04-24 11:59:01 +09:00]] 版))