古代的楚河漢界明確規(guī)定了楚漢兩軍的活動界限,理應遵守,否則必天下大亂,而事實上天下曾大亂后又統(tǒng)一。這里我們不用管這些“分久必合,合久必分”的問題,關(guān)鍵是看到這里規(guī)定的“界限”。Web世界之所以能如此美好地呈現(xiàn)在我們面前,多虧了瀏覽器的功勞,不過瀏覽器不是一個花瓶——只負責呈現(xiàn),它還制定了一些安全策略,這些安全策略有效地保障了用戶計算機的本地安全與Web安全。
專注于為中小企業(yè)提供成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)袁州免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
注:
計算機的本地與Web是不同的層面,Web世界(通常稱為Internet域)運行在瀏覽器上,而被限制了直接進行本地數(shù)據(jù)(通常稱為本地域)的讀寫。
同源策略是眾多安全策略的一個,是Web層面上的策略,非常重要,如果少了同源策略,就等于楚漢兩軍沒了楚河漢界,這樣天下就大亂了。
同源策略規(guī)定:不同域的客戶端腳本在沒明確授權(quán)的情況下,不能讀寫對方的資源。
下面分析同源策略下的這個規(guī)定,其中有幾個關(guān)鍵詞:不同域、客戶端腳本、授權(quán)、讀寫、資源。
同域要求兩個站點同協(xié)議、同域名、同端口,比如:表 1-1 展示了表中所列站點與http://www.foo.com是否同域的情況。
表1-1 是否同域情況
站 點 | 是否同域 | 原 因 |
https://www.foo.com | 不同域 | 協(xié)議不同,https與http是不同的協(xié)議 |
http://xeyeteam.foo.com | 不同域 | 域名不同,xeyeteam子域與www子域不同 |
http://foo.com | 不同域 | 域名不同,頂級域與www子域不是一個概念 |
http://www.foo.com:8080 | 不同域 | 端口不同,8080與默認的80端口不同 |
http://www.foo.com/a/ | 同域 | 滿足同協(xié)議、同域名、同端口,只是這里多了一個目錄而已 |
從表1-1中的對比情況可以看出,我們通常所說的兩個站點同域就是指它們同源。
客戶端腳本主要指JavaScript(各個瀏覽器原生態(tài)支持的腳本語言)、ActionScript(Flash的腳本語言),以及JavaScript與ActionScript都遵循的ECMAScript腳本標準。Flash提供通信接口,使得這兩個腳本語言可以很方便地互相通信。客戶端的***幾乎都是基于這兩個腳本語言進行的,當然JavaScript是最廣泛的。
被打入“冷宮”的客戶端腳本有VBScript,由于該腳本語言相對較孤立,又有當紅的JavaScript存在,所以實在是沒有繼續(xù)存在的必要。
一般情況下,看到這個詞,我們往往會想到服務端對客戶端訪問的授權(quán)??蛻舳艘泊嬖谑跈?quán)現(xiàn)象,比如:HTML5新標準中提到關(guān)于AJAX跨域訪問的情況,默認情況下是不允許跨域訪問的,只有目標站點(假如是http://www.foo.com)明確返回HTTP響應頭:
Access-Control-Allow-Origin: http://www.evil.com
那么www.evil.com站點上的客戶端腳本就有權(quán)通過AJAX技術(shù)對www.foo.com上的數(shù)據(jù)進行讀寫操作。這方面的***細節(jié)很有趣,相關(guān)內(nèi)容在后面會詳細介紹。
注:
AJAX是Asynchronous JavaScript And XML的縮寫,讓數(shù)據(jù)在后臺進行異步傳輸,常見的使用場景有:對網(wǎng)頁的局部數(shù)據(jù)進行更新時,不需要刷新整個網(wǎng)頁,以節(jié)省帶寬資源。AJAX也是***進行Web客戶端***常用的技術(shù),因為這樣***就可以悄無聲息地在瀏覽器后臺進行,做到“殺人無形”。
Web上的資源有很多,有的只有讀權(quán)限,有的同時擁有讀和寫的權(quán)限。比如:HTTP請求頭里的Referer(表示請求來源)只可讀,而document.cookie則具備讀寫權(quán)限。這樣的區(qū)分也是為了安全上的考慮。
資源是一個很廣泛的概念,只要是數(shù)據(jù),都可以認為是資源。同源策略里的資源是指Web客戶端的資源。一般來說,資源包括:HTTP消息頭、整個DOM樹、瀏覽器存儲(如:Cookies、Flash Cookies、localStorage等)??蛻舳税踩{都是圍繞這些資源進行的。
注:
DOM全稱為Document Object Model,即文檔對象模型,就是瀏覽器將HTML/XML這樣的文檔抽象成一個樹形結(jié)構(gòu),樹上的每個節(jié)點都代表HTML/XML中的標簽、標簽屬性或標簽內(nèi)容等。這樣抽象出來就大大方便了JavaScript進行讀/寫操作。Web客戶端的***幾乎都離不開DOM操作。
到此,已經(jīng)將同源策略的規(guī)定分析清楚,如果Web世界沒有同源策略,當你登錄Gmail郵箱并打開另一個站點時,這個站點上的JavaScript就可以跨域讀取你的Gmail郵箱數(shù)據(jù),這樣整個Web世界就無隱私可言了。這就是同源策略的重要性,它限制了這些行為。當然,在同一個域內(nèi),客戶端腳本可以任意讀寫同源內(nèi)的資源,前提是這個資源本身是可讀可寫的。
本文節(jié)選自《web前端***技術(shù)揭秘》
鐘晨鳴,徐少培編著
電子工業(yè)出版社出版