關於跨域補充說明
阿新 • • 發佈:2018-12-19
什麼是跨域?
跨域是指一個域下的文件或指令碼試圖去請求另一個域下的資源,這裡跨域是廣義的。
廣義的跨域:
1.) 資源跳轉: A連結、重定向、表單提交
2.) 資源嵌入: <link>、<script>、<img>、<frame>等dom標籤,還有樣式中background:url()、@font-face()等檔案外鏈
3.) 指令碼請求: js發起的ajax請求、dom和js物件的跨域操作等
其實我們通常所說的跨域是狹義的,是由瀏覽器同源策略限制的一類請求場景。
什麼是同源策略? 同源策略/SOP(Same origin policy)是一種約定,由Netscape公司1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議+域名+埠"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。
同源策略限制以下幾種行為:
1.) Cookie、LocalStorage 和 IndexDB 無法讀取
2.) DOM 和 Js物件無法獲得
3.) AJAX 請求不能傳送
常見跨域場景
URL 說明 是否允許通訊 http://www.domain.com/a.js http://www.domain.com/b.js 同一域名,不同檔案或路徑 允許 http://www.domain.com/lab/c.js http://www.domain.com:8000/a.js http://www.domain.com/b.js 同一域名,不同埠 不允許 http://www.domain.com/a.js https://www.domain.com/b.js 同一域名,不同協議 不允許 http://www.domain.com/a.js http://192.168.4.12/b.js 域名和域名對應相同ip 不允許 http://www.domain.com/a.js http://x.domain.com/b.js 主域相同,子域不同 不允許 http://domain.com/c.js http://www.domain1.com/a.js http://www.domain2.com/b.js 不同域名 不允許
跨域解決方案
1、 通過jsonp跨域 2、 document.domain + iframe跨域 3、 location.hash + iframe 4、 window.name + iframe跨域 5、 postMessage跨域 6、 跨域資源共享(CORS) 7、 nginx代理跨域 8、 nodejs中介軟體代理跨域 9、 WebSocket協議跨域