| 原因 | 安全機(jī)制 |
| 好處 | 隔離潛在惡意文件 |
| 具體表現(xiàn) | 限制資源交互(不同源加載的文檔、腳本) |
| 源的繼承 |
about:blank或window.open()執(zhí)行的腳本會(huì)繼承打開(kāi)該 URL 的文檔的源 |
| 例外 | IE授信范圍(同域名),端口不受限制 |
| 子域父域通信 | 父域和子域中設(shè)置 document.domain 為相同的值 |
源的定義:
- (網(wǎng)頁(yè))協(xié)議,端口和域名都相同(IE同域名和端口不遵守)
- 文件的源定義: URLs.
源的繼承
data:URLs獲得一個(gè)新的,空的安全上下文。
在頁(yè)面中用 about:blank 或 javascript: URL 執(zhí)行的腳本會(huì)繼承打開(kāi)該 URL 的文檔的源,因?yàn)檫@些類(lèi)型的 URLs 沒(méi)有明確包含有關(guān)原始服務(wù)器的信息。
例如,about:blank 通常作為父腳本寫(xiě)入內(nèi)容的新的空白彈出窗口的 URL(例如,通過(guò) Window.open() 機(jī)制)。 如果此彈出窗口也包含代碼,則該代碼將繼承與創(chuàng)建它的腳本相同的源。data: URL會(huì)得到一個(gè)新的空的安全上下文
注意:在Gecko 6.0之前,如果用戶(hù)在位置欄中輸入 data URLs,data URLs 將繼承當(dāng)前瀏覽器窗口中網(wǎng)頁(yè)的安全上下文
IE 例外
當(dāng)涉及到同源策略時(shí),Internet Explorer 有兩個(gè)主要的不同點(diǎn)
授信范圍(Trust Zones):兩個(gè)相互之間高度互信的域名,如公司域名(corporate domains),不遵守同源策略的限制。
端口:IE 未將端口號(hào)加入到同源策略的組成部分之中,因此 http://company.com:81/index.html 和http://company.com/index.html 屬于同源并且不受任何限制。
這些例外是非標(biāo)準(zhǔn)的,其它瀏覽器也未做出支持,但會(huì)助于開(kāi)發(fā)基于window RT IE的應(yīng)用程序。
源的更改
這條語(yǔ)句執(zhí)行之后,頁(yè)面將會(huì)成功地通過(guò)對(duì) http://company.com/dir/page.html 的同源檢測(cè)(假設(shè)http://company.com/dir/page.html 將其 document.domain 設(shè)置為“company.com”,以表明它希望允許這樣做 - 更多有關(guān)信息,請(qǐng)參閱 document.domain)。然而,company.com 不能設(shè)置 document.domain 為 othercompany.com,因?yàn)樗皇?company.com 的超級(jí)域。
瀏覽器單獨(dú)保存端口號(hào)。任何的賦值操作,包括 document.domain = document.domain 都會(huì)導(dǎo)致端口號(hào)被重寫(xiě)為 null 。因此 company.com:8080 不能僅通過(guò)設(shè)置 document.domain = "company.com" 來(lái)與company.com 通信。必須在他們雙方中都進(jìn)行賦值,以確保端口號(hào)都為 null 。
注意:使用 document.domain 來(lái)允許子域安全訪問(wèn)其父域時(shí),您需要在父域和子域中設(shè)置 document.domain 為相同的值。這是必要的,即使這樣做只是將父域設(shè)置回其原始值。不這樣做可能會(huì)導(dǎo)致權(quán)限錯(cuò)誤。