瀏覽器的同源策略

古代的楚河漢界明確規定了楚漢兩軍的活動界限,理應遵照,不然必天下大亂,而事實上天下曾大亂後又統一。這裏咱們不用管這些「分久必合,合久必分」的問題,關鍵是看到這裏規定的「界限」。Web世界之因此能如此美好地呈如今咱們面前,多虧了瀏覽器的功勞,不過瀏覽器不是一個花瓶——只負責呈現,它還制定了一些安全策略,這些安全策略有效地保障了用戶計算機的本地安全與Web安全。跨域

 注:瀏覽器

計算機的本地與Web是不一樣的層面,Web世界(一般稱爲Internet域)運行在瀏覽器上,而被限制了直接進行本地數據(一般稱爲本地域)的讀寫。安全

同源策略是衆多安全策略的一個,是Web層面上的策略,很是重要,若是少了同源策略,就等於楚漢兩軍沒了楚河漢界,這樣天下就大亂了。cookie

同源策略規定:不一樣域的客戶端腳本在沒明確受權的狀況下,不能讀寫對方的資源。異步

下面分析同源策略下的這個規定,其中有幾個關鍵詞:不一樣域、客戶端腳本、受權、讀寫、資源。spa

1.不一樣域或同域

同域要求兩個站點同協議、同域名、同端口,好比:表 1-1 展現了表中所列站點與http://www.foo.com是否同域的狀況。對象

表1-1  是否同域狀況接口

站    點ip

是否同域ci

原    因

https://www.foo.com

不一樣域

協議不一樣,https與http是不一樣的協議

http://xeyeteam.foo.com

不一樣域

域名不一樣,xeyeteam子域與www子域不一樣

http://foo.com

不一樣域

域名不一樣,頂級域與www子域不是一個概念

http://www.foo.com:8080

不一樣域

端口不一樣,8080與默認的80端口不一樣

http://www.foo.com/a/

同域

知足同協議、同域名、同端口,只是這裏多了一個目錄而已

從表1-1中的對比狀況能夠看出,咱們一般所說的兩個站點同域就是指它們同源。

2.客戶端腳本

客戶端腳本主要指JavaScript(各個瀏覽器原生態支持的腳本語言)、ActionScript(Flash的腳本語言),以及JavaScript與ActionScript都遵循的ECMAScript腳本標準。Flash提供通訊接口,使得這兩個腳本語言能夠很方便地互相通訊。客戶端的攻擊幾乎都是基於這兩個腳本語言進行的,固然JavaScript是最普遍的。

被打入「冷宮」的客戶端腳本有VBScript,因爲該腳本語言相對較孤立,又有當紅的JavaScript存在,因此實在是沒有繼續存在的必要。

3.受權

通常狀況下,看到這個詞,咱們每每會想到服務端對客戶端訪問的受權。客戶端也存在受權現象,好比:HTML5新標準中提到關於AJAX跨域訪問的狀況,默認狀況下是不容許跨域訪問的,只有目標站點(假如是http://www.foo.com)明確返回HTTP響應頭:

Access-Control-Allow-Origin: http://www.evil.com

那麼www.evil.com站點上的客戶端腳本就有權經過AJAX技術對www.foo.com上的數據進行讀寫操做。這方面的攻防細節頗有趣,相關內容在後面會詳細介紹。

 注:

AJAX是Asynchronous JavaScript And XML的縮寫,讓數據在後臺進行異步傳輸,常見的使用場景有:對網頁的局部數據進行更新時,不須要刷新整個網頁,以節省帶寬資源。AJAX也是黑客進行Web客戶端攻擊經常使用的技術,由於這樣攻擊就能夠悄無聲息地在瀏覽器後臺進行,作到「殺人無形」。

4.讀寫權限

Web上的資源有不少,有的只有讀權限,有的同時擁有讀和寫的權限。好比:HTTP請求頭裏的Referer(表示請求來源)只可讀,而document.cookie則具有讀寫權限。這樣的區分也是爲了安全上的考慮。

5.資源

資源是一個很普遍的概念,只要是數據,均可以認爲是資源。同源策略裏的資源是指Web客戶端的資源。通常來講,資源包括:HTTP消息頭、整個DOM樹、瀏覽器存儲(如:Cookies、Flash Cookies、localStorage等)。客戶端安全威脅都是圍繞這些資源進行的。

 注:

DOM全稱爲Document Object Model,即文檔對象模型,就是瀏覽器將HTML/XML這樣的文檔抽象成一個樹形結構,樹上的每一個節點都表明HTML/XML中的標籤、標籤屬性或標籤內容等。這樣抽象出來就大大方便了JavaScript進行讀/寫操做。Web客戶端的攻擊幾乎都離不開DOM操做。

到此,已經將同源策略的規定分析清楚,若是Web世界沒有同源策略,當你登陸Gmail郵箱並打開另外一個站點時,這個站點上的JavaScript就能夠跨域讀取你的Gmail郵箱數據,這樣整個Web世界就無隱私可言了。這就是同源策略的重要性,它限制了這些行爲。固然,在同一個域內,客戶端腳本能夠任意讀寫同源內的資源,前提是這個資源自己是可讀可寫的。

相關文章
相關標籤/搜索