跨域post請求實現方案小結--轉


【名詞解釋】
跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript
同源策略(注意Network Access這一節):http://www.w3.org/Security/wiki/Same_Origin_Policy
 
【問題描述】
瀏覽器出於安全的考量(避免惡意網站輕易讀取其他網站顯示的內容,因為該內容可能含有敏感信息,想象iframe嵌套銀行網頁) 原則上允許跨域寫而限制了跨域讀。寫是指數據的上行/發送(sending request),讀是指數據的下行/接收(receiving response)。(然而跨域寫也是很不安全的,容易導致CSRF/clickjacking攻擊。瀏覽器已經限制了跨域讀,再限制跨域寫的話,那互聯網的每個頁面都成了孤島。避免非法跨域寫需要用到token,本文不做討論。)
 
考慮下述情況:
  1. 指向外部域名的link和通過表單的向外部域發起get請求是一樣的,也都是允許的,點擊那一刻起,瀏覽器的當前域名轉向了目標網站,也就完全是域內寫、讀了。
  2. 通過表單向外部域發起post請求也是允許的,理由同上,源網站無法讀取目標網站的任何內容。
  3. AJAX(借助XMLHttpRequest對象)跨域get/post是禁止的,因為使用AJAX就是為了讀取響應的內容,這觸碰了跨域讀的限制。
  4. JSONP屬於跨域讀,且形式限制為get請求,因為它利用了script標簽的特性(瀏覽器認為跨域讀腳本是例外,類似的還有img、iframe等等,注意它們共有的src屬性)。
 
因此對於瀏覽器而言:1和2沒有跨域;3遵循了限制跨域讀的原則;4屬於允許的例外。
 
 
雖然JSONP很好用,但它注定是get請求,get請求有語義要求(冪等)、長度限制(為了兼容限制255字節)、安全隱患(容易受到csrf攻擊,csrf的解決必須是post請求配合token使用)。
 
 
那么,如何實現跨域post請求呢?
 
【解決方案】
1、CORS
概述: Cross-Origin Resource Sharing,W3C制定的跨站資源分享標准。post前會產生一次options嗅探(稱之為preflight,但 簡單請求不會出現)來確認有否跨域請求的權限;客戶端post時會帶上Origin頭指示來源網站,服務端響應時需帶上Access-Control-Allow-Origin頭與Origin頭的值匹配,以示許可。ie8提供了封裝好的XDomainRequest對象,部分實現了該標准;而其它瀏覽器則提供了 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的定義描述不完整)
優點:W3C標准方案
缺點:不兼容老瀏覽器, 移動瀏覽器尚未支持。    桌面和移動瀏覽器兼容性
 
注意:若在多個iframe之間跨域通信,優先考慮  window.postMessage
 
2、invisible iframe
概述:通過js動態生成不可見表單和iframe,將表單的target設為iframe的name以此通過iframe做post提交。提交后由於跨域,無法直接讀取響應內容。一般的做法是,iframe內通過js改變自身location的fragment,外部則監聽iframe的onload事件,讀取fragment的內容。有現成的跨域iframe通信類庫,如jQuery PostMessage Plugin。
要求:ie6/safari/GC/FF4
優點:兼容性佳,facebook,google,新浪已/曾采用
缺點:依賴hack實現,響應數據量大時需要切片、多次設置fragment並輪詢,響應頻繁時可能失效。
 
3、server proxy 
概述:當前域實現一個代理,所有向外部域名發送的請求都徑由該代理中轉。
缺點:每個使用方都需要部署代理,數據中轉低效,對js有侵入。
 
4、flash proxy
概述:利用不可見的swf跨域post提交數據,需要部署crossdomain.xml。例如alirte會自動檢測,若用戶安裝了flash,則以此實現跨域通信。
要求:flash9
優點:ADOBE標准方案,相對CORS兼容性佳,相對invisible iframe響應數據量較大時優勢明顯。
缺點:依賴flash。
 
原文:http://blog.csdn.net/doraeimo/article/details/7329779


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM