先來了解一個新名次CROB,全稱Cross-Origin Read Blocking
,是一種遏制執行惡意程式碼保護使用者資料隱私的安全策略。不同於CROS
,這個策略的執行端是在瀏覽器這邊,自Chrome 68以後的版本都是預設開啟這個策略的。
那麼這個CROB會給我們的開發帶來什麼影響呢?
首先就是無論你是否已經在伺服器端配置了CROS策略,但是隻要你請求的資料是
- html mime type
- xml mime type(除了 image/svg+xml)
- json mime type
- text/plain
這四種文件型別,那麼都不能實現跨域訪問,雖然資料的確已經傳輸到了你的瀏覽器,但是你會發現你死活救贖無法讀取這些資料,沒錯,瀏覽器把這些資料在底層給你封閉鎖死了,這樣一來要實現跨域攻擊的難度就又提高了。
對於普通使用者來說提高了安全性是一件好事,但是對於開發者來說又是一道坎,但是沒辦法這道坎還是要過。
那麼什麼時候我們會遇到這道坎呢?如果你是同一個域名下的話,不會有影響,有影響的是呼叫第三方API時候才會發生,因為不是同源,而且就算對方的伺服器開啟了同源策略,在瀏覽器端依舊會受制於CROB策略,這可怎麼辦?
解決這個辦法有點小困難,因為需要在伺服器端也要做調整,如果沒有這個許可權的話就只能使用後臺代理技術來實現了。那麼來介紹下怎麼實現把。
解決方法
伺服器端
伺服器端需要對返回資料型別是text/json
和application/json
的資料做一下更改,將MIME型別改成其他任意值都可以,比如說text/json8
這樣。
然後需要將返回資料處理一下,在最前面插入非{
的字元,像facebook是使用for(;;;){}
這樣的形式最為前導字元,然後和要返回的JSON
字串合併起來傳送給客戶端。
客戶端
客戶端只要檢查MIME型別,符合指定型別的時候就把前導字串去除,然後序列化JSON
資料就可以了