同源策略限制了從不同源加載的文檔或腳本之間的交互。是用于隔離潛在惡意文件的重要安全機制。
同源定義
影響源的因素: 域名(Host)、端口(Port)、協(xié)議(Protocol)
相對http://example.flexiblecat.com/dir/index.html同源檢測的示例:
(默認端口為80)
| URL | 結(jié)果 | 原因 |
|---|---|---|
http://example.flexiblecat.com/dir/fine.html |
成功 | |
http://other.flexiblecat.com/dir/index.html |
失敗 | 不同域名 |
http://example.flexiblecat.com/dir/nice.html:81 |
失敗 | 端口不同 |
https://example.flexiblecat.com/dir/cross.html |
失敗 | 協(xié)議不同 |
誰受約束?
DOM、Cookie、第三方插件以及XMLHttpRequest都受到同源策略的約束。
Cookie
只有同源的網(wǎng)頁才能共享,但是若兩個頁面一級域名相同,只是二級域名不同,那么瀏覽器可以通過設置document.domain來共享Cookie。

這是網(wǎng)頁A:http://a.flexiblecat.com/index.tml
這是網(wǎng)頁B:http://b.flexiblecat.com/index.tml
只要把他們的document.domain設置成相同的,例如:document.domain='flexiblecat.com',這兩個網(wǎng)頁就可一共享Cookie啦~
不過這種方法只適用于Cookie和iframe窗口
XMLHttpRequest
它受到同源策略的約束,不能跨域訪問資源,但是W3C委員會制定了XMLHttpRequest跨域訪問標準。
通過目標返回的HTTP頭來授權(quán),是否允許跨域訪問。實現(xiàn)這一點的安全基礎(chǔ)是JavaScript無法控制HTTP頭。
第三方插件
常見的有Flash、Google Gears等。第三方插件的同源策略是它們自己的,不是瀏覽器原生同源策略,若有漏洞,可能會被利用,產(chǎn)生XSS等攻擊
同源策略并不是牢不可摧的,也可能被繞過,典型的有IE 8的CSS跨域漏洞。
這一個漏洞是利用@import加載企圖被讀取內(nèi)容的頁面A為CSS文件,渲染進入當前頁面的DOM,然后通過document.body.currentStyle.frontFamily來訪問頁面A的內(nèi)容。具體內(nèi)容,感興趣的話可以自行百度一下,也很好找。
要看一個網(wǎng)站的策略文件,一般都是URL后面加上
/crossdomain.xml
誰不受限制?
一個頁面編寫過程中會用到很多很多的標簽,勤勤懇懇認真堅守崗位的小螺絲釘們。但是可別小看他們,有的小螺絲釘可是不受同源策略的限制的哦~
例如:<script>、<img>、<link>、<iframe>等帶src屬性的標簽;
為什么它們可以被允許跨域嵌入?
- 首先,網(wǎng)站的JS腳本、圖片、音頻等資源不一定是放在存儲網(wǎng)站頁面的服務器上的,可能會通過別的方式將資源傳送到瀏覽器中;
- 其次,網(wǎng)站的編寫人員正常情況下并不會故意加載惡意腳本到網(wǎng)站中,所以,我們默認正常網(wǎng)頁的腳本是安全的;
- 最后,對于當前頁面來說,頁面內(nèi)加載的JS文件本身放在哪里并不重要,只要它被誰加載了,就和誰同源。例如:
a.js這個JS文件,原本在x.com頁面中,后來它被y.com這個頁面加載了,這個時候,a.js就和y.com這個頁面同源,而不是x.com。
跨域漏洞圍觀:
UC瀏覽器跨本地域XSS可盜取任意域Cookie https://www.secpulse.com/archives/16840.html
JSONP和CORS跨站跨域讀取資源的漏洞利用 https://www.anquanke.com/post/id/152339
寫在最后,這一塊內(nèi)容必須得了解一下,這是瀏覽器安全很重要的內(nèi)容,沒有它,你還敢用瀏覽器嘛!你的Cookie能被人隨意取用,你的信息沒有保障,怕是要上天哦。
關(guān)于W3C委員會制定的XMLHttpRequest跨域訪問標準,感興趣的話自己去查一下了解一下就行。