【名詞解釋】
跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript
同源策略(注意Network Access這一節(jié)):http://www.w3.org/Security/wiki/Same_Origin_Policy
【問題描述】
瀏覽器出于安全的考量(避免惡意網(wǎng)站輕易讀取其他網(wǎng)站顯示的內(nèi)容,因為該內(nèi)容可能含有敏感信息,想象iframe嵌套銀行網(wǎng)頁)原則上允許跨域?qū)懚拗屏丝缬蜃x。寫是指數(shù)據(jù)的上行/發(fā)送(sending request),讀是指數(shù)據(jù)的下行/接收(receiving response)。(然而跨域?qū)懸彩呛懿话踩?,容易?dǎo)致CSRF/clickjacking攻擊。瀏覽器已經(jīng)限制了跨域讀,再限制跨域?qū)懙脑?,那互?lián)網(wǎng)的每個頁面都成了孤島。避免非法跨域?qū)懶枰玫絫oken,本文不做討論。)
考慮下述情況:
- 指向外部域名的link和通過表單的向外部域發(fā)起get請求是一樣的,也都是允許的,點擊那一刻起,瀏覽器的當前域名轉(zhuǎn)向了目標網(wǎng)站,也就完全是域內(nèi)寫、讀了。
- 通過表單向外部域發(fā)起post請求也是允許的,理由同上,源網(wǎng)站無法讀取目標網(wǎng)站的任何內(nèi)容。
- AJAX(借助XMLHttpRequest對象)跨域get/post是禁止的,因為使用AJAX就是為了讀取響應(yīng)的內(nèi)容,這觸碰了跨域讀的限制。
- JSONP屬于跨域讀,且形式限制為get請求,因為它利用了script標簽的特性(瀏覽器認為跨域讀腳本是例外,類似的還有img、iframe等等,注意它們共有的src屬性)。
因此對于瀏覽器而言:1和2沒有跨域;3遵循了限制跨域讀的原則;4屬于允許的例外。
雖然JSONP很好用,但它注定是get請求,get請求有語義要求(冪等)、長度限制(為了兼容限制255字節(jié))、安全隱患(容易受到csrf攻擊,csrf的解決必須是post請求配合token使用)。
那么,如何實現(xiàn)跨域post請求呢?
【解決方案】
1、CORS
概述:
Cross-Origin Resource Sharing,W3C制定的跨站資源分享標準。post前會產(chǎn)生一次options嗅探(稱之為preflight,但
簡單請求不會出現(xiàn))來確認有否跨域請求的權(quán)限;客戶端post時會帶上Origin頭指示來源網(wǎng)站,服務(wù)端響應(yīng)時需帶上Access-Control-Allow-Origin頭與Origin頭的值匹配,以示許可。ie8提供了封裝好的XDomainRequest對象,部分實現(xiàn)了該標準;而其它瀏覽器則提供了
XMLHttpRequest(Level 2)對象。
要求:ie8(XDomainRequest)/ie10/safari4/GC/FF3.5
參考:
cross-site xmlhttprequest with CORS
參考:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
參考(中文):http://www.zfkun.com/394.html (simple reuest的定義描述不完整)
優(yōu)點:W3C標準方案
2、invisible iframe
概述:通過js動態(tài)生成不可見表單和iframe,將表單的target設(shè)為iframe的name以此通過iframe做post提交。提交后由于跨域,無法直接讀取響應(yīng)內(nèi)容。一般的做法是,iframe內(nèi)通過js改變自身location的fragment,外部則監(jiān)聽iframe的onload事件,讀取fragment的內(nèi)容。有現(xiàn)成的跨域iframe通信類庫,如jQuery PostMessage Plugin。
要求:ie6/safari/GC/FF4
優(yōu)點:兼容性佳,facebook,google,新浪已/曾采用
缺點:依賴hack實現(xiàn),響應(yīng)數(shù)據(jù)量大時需要切片、多次設(shè)置fragment并輪詢,響應(yīng)頻繁時可能失效。
3、server proxy
概述:當前域?qū)崿F(xiàn)一個代理,所有向外部域名發(fā)送的請求都徑由該代理中轉(zhuǎn)。
缺點:每個使用方都需要部署代理,數(shù)據(jù)中轉(zhuǎn)低效,對js有侵入。
4、flash proxy
概述:利用不可見的swf跨域post提交數(shù)據(jù),需要部署crossdomain.xml。例如alirte會自動檢測,若用戶安裝了flash,則以此實現(xiàn)跨域通信。
要求:flash9
優(yōu)點:ADOBE標準方案,相對CORS兼容性佳,相對invisible iframe響應(yīng)數(shù)據(jù)量較大時優(yōu)勢明顯。
缺點:依賴flash。
原文:http://blog.csdn.net/doraeimo/article/details/7329779
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。