HTML5 script 標簽的 crossorigin 屬性到底有什么用?
1
2
3
|
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
crossorigin="anonymous"></script>
|
看起來比以前的寫法復雜好多的樣子。先不着急慢慢看,多了一個 integrity 屬性,看值的樣子就知道是用來驗證文件完整性的。另外還有一個 crossorigin 屬性……怎么?直接通過 script 標簽加載網站外 JS 資源也要開始考慮跨域的問題了嗎?
這里不討論 script
里 crossorigin 屬性怎么用,以及服務器端如何支持此屬性,MDN 上的文檔已經說得很清楚。
不知道大家對此新屬性的感覺如何,我的第一感覺是:新加了這么一個屬性,難道是以前 script 不用 crossorigin 屬性的時候,會出什么問題嗎?到底可能會出什么問題呢?
從谷歌的結果來看,比較一致的說法是,引入跨域的腳本(比如用了 apis.google.com 上的庫文件),如果這個腳本有錯誤,因為瀏覽器的限制(根本原因是協議的規定),是拿不到錯誤信息的。當本地嘗試使用 window.onerror
去記錄腳本的錯誤時,跨域腳本的錯誤只會返回 Script error
。
但 HTML5 新的規定,是可以允許本地獲取到跨域腳本的錯誤信息,但有兩個條件:一是跨域腳本的服務器必須通過 Access-Controll-Allow-Origin
頭信息允許當前域名可以獲取錯誤信息,二是當前域名的 script
標簽也必須指明 src
屬性指定的地址是支持跨域的地址,也就是 crossorigin 屬性。
但事情還是不夠明朗,看起來報個錯也沒什么啊,為什么瀏覽器或者說協議這么龜毛,非要規定默認頁面是不能獲取跨域腳本錯誤信息的呢?
這其實跟網絡安全有關,不妨舉一個例子來說明。
我們先假設瀏覽器默認可以將跨域腳本的錯誤信息返回。
這個時候我在我的博客里寫下如下代碼:
1
2
3
|
<script src="http://某個銀行/會員信息網址">
<script src="http://某個銀行2/會員信息網址">
...
|
注意 src 里面提到地址,都是 HTML 頁面的地址,當成 JS 來執行,肯定是會報錯的。
因為我們假設瀏覽器能報具體錯誤,這個錯誤可能是類似於:
1. “請登錄” is undefined.
2. “您好” is undefined.
我們通過報錯信息的不一致,可能可以推斷出當前訪問我博客的會員在某某銀行是否有賬號。雖然不是什么大問題,但隱私的確是泄漏了,如果我是攻擊者我可能會通過會員在某家銀行有賬號,『精准』推送相關的釣魚網站給他。
說清楚了來龍去脈,我們就可以更好的判斷,我們是否真的需要給 script
標簽加上 crossorigin 屬性了。另外除了 script
,所有能引入跨域資源的標簽包括 link
和 img
之類,都有一樣的屬性。