這些年,那些跨域

1、同源策略與跨站腳本攻擊

  JavaScript 的同源策略,是由Netscape提出的一個著名的安全策略,爲了阻止A站的JS去操做別的網站的數據。你想啊,你如今打開了瀏覽器,在一個tab窗口中打開了銀行網站,在另一個tab窗口中打開了一個惡意網站,而那個惡意網站掛了一個的專門修改銀行信息的JavaScript,當你訪問這個惡意網站而且執行它JavaScript時,你的銀行頁面就會被這個JavaScript修改(好比說獲取你的卡號和密碼,又或者是轉帳到黑客的帳戶上等等),後果會很是嚴重!而同源策略就爲了防止這種事情發生,它規定了A網站下的JS文件只能操做A網站下的數據,不能去操做B網站的數據。html

2、跨域方式總結 

場景1-JSONP JSON with padding

  JSONP由兩部分組成:回調函數和數據。經過動態建立script,再請求一個帶參網址實現跨域通訊,服務器收到請求後,將數據放在一個指定名字的回調函數裏傳回來。前端

  優點:先後端易實現,兼容性好。vue

  問題:一、只能實現get請求二、不便處理接口錯誤 三、接口併發請求時,回調名必須不一樣c++

場景2-document.domain  

  有一個頁面是http://www.example.com/a.html,web

  在這個頁面中還有一個http://www.child.example.com/b.htmlajax

  很顯然,a.html與b.html是不一樣域的,因此咱們沒法經過在頁面中書寫js代碼來獲取iframe中的東西,可是,若是咱們把這2個頁面的document.domain都設置成相同的域名就能夠了,須要注意的是,咱們只能把document.domain設置成自身或更高一級的父域,且主域名必須相同。canvas

  優點:document.domain適用於主域相同,不一樣子域的框架之間的交互。後端

  問題:非不一樣子域框架間無效。在file(本地文件訪問)狀況下,設置domain失效。跨域

場景3-window.postMessage瀏覽器

  postMessage是HTML5中的API,且是爲數很少能夠跨域操做的window屬性之一,它可用於解決如下方面的問題:

 

  a.) 頁面和其打開的新窗口的數據傳遞
  b.) 多窗口之間消息傳遞
  c.) 頁面與嵌套的iframe消息傳遞
  d.) 上面三個場景的跨域數據傳遞

場景4-window.name

  window對象有個name屬性,該屬性有一個特徵:即在一個窗口的生命週期內,窗口載入的全部頁面都是共享一個window.name的,每一個頁面對window.name都有讀寫的權限,window.name是持久存在一個窗口載入過的全部頁面中的。

場景5-CORS跨域資源共享

  跨域資源共享定義了在必須訪問跨域資源的時,瀏覽器與服務器應該如何溝通。他的原理是使用自定義的 HTTP 頭部,讓服務器與瀏覽器進行溝通,主要是經過設置響應頭的 Access-Control-Allow-Origin 來達到目的的。

  優點:支持get、post各類請求方法。

  問題:兼容性,瀏覽器不能低於IE10。須要服務端設置報文頭部。

場景6-反向代理跨域

  同源策略是瀏覽器的安全策略,不是HTTP協議的一部分。服務器端調用HTTP接口只是使用HTTP協議,不會執行JS腳本,不須要同源策略,也就不存在跨越問題。

  實現思路:經過配置一個代理服務器(域名與domain1相同,端口不一樣)作跳板機,反向代理訪問domain2接口。

  優點:不存在前端跨域問題,服務器間接口調用效率能夠提升

  問題:多配置一臺服務器,成本較高。

場景7- WebSocket協議

  WebSocket protocol是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通訊,同時容許跨域通信,是server push技術的一種很好的實現。

  原生WebSocket API使用起來不太方便,咱們使用Socket.io,它很好地封裝了webSocket接口,提供了更簡單、靈活的接口,也對不支持webSocket的瀏覽器提供了向下兼容。

  優點:跨域、全雙工、服務器推送

  問題:須要服務器配套協議支持

場景8- location.hash + iframe跨域

  實現原理: a欲與b跨域相互通訊,經過中間頁c來實現。 三個頁面,不一樣域之間利用iframe的location.hash傳值,相同域之間直接js訪問來通訊。

  具體實現:A域:a.html -> B域:b.html -> A域:c.html,a與b不一樣域只能經過hash值單向通訊,b與c也不一樣域也只能單向通訊,但c與a同域,因此c可經過parent.parent訪問a頁面全部對象。

 

3、工做中的實例

  一、Iframe在網絡協議中的跨域document.domain

  異步上傳文件的方式:

     一、ajax2級,實現post發送,真正的異步發送,但有兼容性問題。

    二、ajaxfileupload.js使用iframe實現異步上傳。當須要用到跨域時要作修改。 

  二、Iframe在file協議中的跨域postMessage

  在一個c++客戶端,內嵌html頁面時,iframe之間的通訊在file協議下收到限制

  三、Canvas讀取圖片數據cors

  爲了實如今前端將圖片黑白化處理,用到canvas讀取圖片。圖片緩存服務器一般會跨域。 

  四、JSOP使用過程,回傳格式有誤

  回傳必須是函數包裹數據,後端可能會失誤,漏掉。或者回調名不變,當併發請求時會報錯。 

  五、Img錯誤彙報,統計計數

  前端性能監控,錯誤監控,埋點計數等,使用圖片的請求將數據發送回服務端。

  六、服務器反向代理,vue開發腳手架

  在本地開發Vue項目時,能夠啓用腳手架的代理服務,完成跨域訪問測試環境。

相關文章
相關標籤/搜索