同源策略
在客戶端編程語言中,如JavaScript和ActionScript,同源策略是一個很重要的安全理念,它在保證數(shù)據(jù)的安全性方面有著重要的意義。同源策略規(guī)定跨域之間的腳本是隔離的,一個域的腳本不能訪問和操作另外一個域的絕大部分屬性和方法。那么什么叫相同域,什么叫不同的域呢?當(dāng)兩個域具有相同的協(xié)議(如http), 相同的端口(如80),相同的host(如www.example.org),那么我們就可以認(rèn)為它們是相同的域。比如http://www.example.org/index.html和http://www.example.org/sub/index.html是同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何兩個都將構(gòu)成跨域。同源策略還應(yīng)該對一些特殊情況做處理,比如限制file協(xié)議下腳本的訪問權(quán)限。本地的HTML文件在瀏覽器中是通過file協(xié)議打開的,如果腳本能通過file協(xié)議訪問到硬盤上其它任意文件,就會出現(xiàn)安全隱患,目前IE8還有這樣的隱患。
受到同源策略的影響,跨域資源共享就會受到制約。但是隨著人們的實踐和瀏覽器的進(jìn)步,目前在跨域請求的技巧上,有很多寶貴經(jīng)驗的沉淀和積累。這里我把跨域資源共享分成兩種,一種是單向的數(shù)據(jù)請求,還有一種是雙向的消息通信。接下來我將羅列出常見的一些跨域方式,以下跨域?qū)嵗脑创a可以從這里獲得。
單向跨域
JSONP
JSONP (JSON with Padding)是一個簡單高效的跨域方式,HTML中的script標(biāo)簽可以加載并執(zhí)行其他域的JavaScript,于是我們可以通過script標(biāo)記來動態(tài)加載其他域的資源。例如我要從域A的頁面pageA加載域B的數(shù)據(jù),那么在域B的頁面pageB中我以JavaScript的形式聲明pageA需要的數(shù)據(jù),然后在pageA中用script標(biāo)簽把pageB加載進(jìn)來,那么pageB中的腳本就會得以執(zhí)行。JSONP在此基礎(chǔ)上加入了回調(diào)函數(shù),pageB加載完之后會執(zhí)行pageA中定義的函數(shù),所需要的數(shù)據(jù)會以參數(shù)的形式傳遞給該函數(shù)。JSONP易于實現(xiàn),但是也會存在一些安全隱患,如果第三方的腳本隨意地執(zhí)行,那么它就可以篡改頁面內(nèi)容,截獲敏感數(shù)據(jù)。但是在受信任的雙方傳遞數(shù)據(jù),JSONP是非常合適的選擇。
Flash URLLoader
Flash有自己的一套安全策略,服務(wù)器可以通過crossdomain.xml文件來聲明能被哪些域的SWF文件訪問,SWF也可以通過API來確定自身能被哪些域的SWF加載。當(dāng)跨域訪問資源時,例如從域www.a.com請求域www.b.com上的數(shù)據(jù),我們可以借助Flash來發(fā)送HTTP請求。首先,修改域www.b.com上的crossdomain.xml(一般存放在根目錄,如果沒有需要手動創(chuàng)建) ,把www.a.com加入到白名單。其次,通過Flash URLLoader發(fā)送HTTP請求,最后,通過Flash API把響應(yīng)結(jié)果傳遞給JavaScript。Flash URLLoader是一種很普遍的跨域解決方案,不過需要支持iOS的話,這個方案就無能為力了。
Access Control
Access Control是比較超越的跨域方式,目前只在很少的瀏覽器中得以支持,這些瀏覽器可以發(fā)送一個跨域的HTTP請求(Firefox, Google Chrome等通過XMLHTTPRequest實現(xiàn),IE8下通過XDomainRequest實現(xiàn)),請求的響應(yīng)必須包含一個Access-Control-Allow-Origin的HTTP響應(yīng)頭,該響應(yīng)頭聲明了請求域的可訪問權(quán)限。例如www.a.com對www.b.com下的asset.php發(fā)送了一個跨域的HTTP請求,那么asset.php必須加入如下的響應(yīng)頭:
header("Access-Control-Allow-Origin: http://www.a.com");
出處:口碑網(wǎng)UED Team
責(zé)任編輯:bluehearts
上一頁 下一頁 跨域資源共享的10種方式 [2]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|