CORS 協議(跨域資源共享)


 

跨域問題

只要協議、域名、端口有任何一個不同,都被當作是不同的域。

image

 

為什么會有跨域的限制?

之前發生過的一些跨域安全事件:

新浪微博XSS受攻擊事件


2011年6月28日晚,新浪微博出現了一次比較大的XSS攻擊事件。大量用戶自動發送諸如:“郭美美事件的一些未注意到的細節”,“建黨大業中穿幫的地方”,“讓女人心動的100句詩歌”,“3D肉團團高清普通話版種子”,“這是傳說中的神仙眷侶啊”,“驚爆!范冰冰艷照真流出了”等等微博和私信,並自動關注一位名為hellosamy的用戶。
事件的經過線索如下:
20:14,開始有大量帶V的認證用戶中招轉發蠕蟲
20:30,某網站中的病毒頁面無法訪問
20:32,新浪微博中hellosamy用戶無法訪問
21:02,新浪漏洞修補完畢

http://coolshell.cn/articles/4914.html 

百度貼吧xss攻擊事件


2014年3月9晚,六安吧等幾十個貼吧出現點擊推廣貼會自動轉發等。

並且受到xss攻擊的轉帖吧友所關注的每個關注的貼吧都會轉一遍,病毒循環發帖。並且導致吧務人員,和吧友被封禁。

 

CORS 協議

CORS 協議是W3C的標准協議(https://www.w3.org/TR/cors/ ),

CORS(Cross-Origin Resource Sharing)跨域資源共享,這個協議 定義了必須在訪問跨域資源時,瀏覽器與服務器應該如何溝通。CORS背后的基本思想就是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或響應是應該成功還是失敗。

 

CORS 瀏覽器的支持情況

各種瀏覽器對 CORS 的支持情況如下圖。(圖來自: http://caniuse.com/#search=CORS

image

  • IE11 does not appear to support CORS for images in the canvas element
  • Android and some old versions of WebKit (that may be found in various webview implementations) do not support Access-Control-Expose-Headers: https://code.google.com/p/android/issues/detail?id=56726
  • IE10+ does not make a CORS request if port is the only difference (IE Bug #781303)
  • IE10+ does not send cookies when withCredential=true (IE Bug #759587). A workaround is to use a P3P policy

 

CORS 的工作流

image

圖來自: http://www.html5rocks.com/en/tutorials/cors/

如果瀏覽器 自身提供對CROS的支持,由它發送的請求會攜帶一個名為“Origin”的報頭表明請求頁面所在的站點。

資源獲取請求被提供者接收之后,它可以根據該報頭確定提供的資源需要共享給誰。資源提供者的授權通過一個名為“Access-Control-Allow-Origin”的響應報頭來承載,其報頭值表示得到授權的站點。一般來說,如果資源的提供者認可了當前請求的“Origin”報頭攜帶的站點,那么它會將該站點作為“Access-Control-Allow-Origin”響應報頭的值。除了指定具體的源並對其作針對性授權之外,資源提供者還可以將“Access-Control-Allow-Origin”報頭值設置為“*”對所有消費者授權。

當瀏覽器接收到包含資源的響應之后,會提取此“Access-Control-Allow-Origin”響應報頭的值。如果此值為“*”或者包含的源列表包含此前請求的源(即請求的“Origin”報頭值),意味着資源的消費者獲取了提供者獲取和操作資源的權限,所以瀏覽器會允許JavaScript程序操作獲取的資源。如果此響應報頭不存在或者其值為“null”,客戶端JavaScript程序針對資源的操作會被拒絕。

 

服務器端支持 CORS 的 流程圖

cors_server_flowchart

圖來自: http://www.html5rocks.com/en/tutorials/cors/ 

tomcat 添加CROS跨源請求 請參考 http://blog.csdn.net/liuwei063608/article/details/47273971 

 

我們之前在玩 jsonp 的時候, 也會遇到跨域的問題, 它跟 cors 的對比如下:

CORS與JSONP相比,無疑更新,考慮支持的更全。


1、 JSONP只能實現GET請求,而CORS支持所有類型的HTTP請求。

2、 使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得數據,比起JSONP有更好的錯誤處理。

3、 JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS。

 

參考資料:

Cross-Origin Resource Sharing協議介紹
http://www.cnblogs.com/shanyou/archive/2012/09/16/2687907.html 

詳解js跨域問題
https://segmentfault.com/a/1190000000718840 

W3C的CORS Specification
http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-02.html

Spring通過CROS協議解決跨域問題
http://www.open-open.com/lib/view/open1463878352785.html


免責聲明!

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



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