這根本是不可能得到由<script>
標籤引用的任何文件的內容。這是有充分的理由的:這樣做可以讓你規避XHR的同源政策。
考慮:
<script src="https://www.example.com/private/api/getAuthToken" id="s"></script>
如果您可以訪問respnse的文字,你可以這樣做:
var stolenAuthToken = $('#s').text();
這顯然不好。因此,您絕不允許閱讀由<script>
標籤引入的內容。
您的具體情況是由相對最近推出change複雜凡在跨域腳本錯誤,不報告到您的網頁的onerror
處理任何有用的信息。 (本質上,這是爲了修補信息泄漏安全漏洞,允許惡意網站推斷您是否登錄了某些知名網站等)。
這意味着您沒有獲得任何有用的信息有關從CDN託管腳本錯誤,所以another change是爲了允許一個CDN(或其他非同源)服務器使用CORS,以便選擇允許完全錯誤的詳細信息要傳遞給onerror
處理程序。
我們(Facebook)需要一種機制來禁用#363897中實施的window.onerror
屏蔽行爲。我們的靜態腳本資源在與主站點不同的域下的CDN上提供。由於這些域不同,我們正在與x域邏輯發生衝突,這種邏輯阻止我們收集關於瀏覽器錯誤的有用信息。
這個「功能」已經在野外通過了足夠廣泛(在Firefox和WebKit瀏覽器),大多數我們看到生產未捕獲的異常的,現在在他們不採取行動的信息。
crossorigin
attribute(最初打算用於<img>
)允許您指定資源應該加載CORS規則。它已由Mozilla實施,WebKit和Chrome。
<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script>
不幸的是你,在我testing,我發現谷歌CDN不不發送CORS標頭。
GET http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js HTTP/1.1
Host: ajax.googleapis.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://fiddle.jshell.net/josh3736/jm2JU/show/
Origin: http://fiddle.jshell.net
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 200 OK
Vary: Accept-Encoding
Content-Type: text/javascript; charset=UTF-8
Last-Modified: Tue, 13 Nov 2012 19:53:02 GMT
Date: Wed, 02 Jan 2013 22:54:25 GMT
Expires: Thu, 02 Jan 2014 22:54:25 GMT
X-Content-Type-Options: nosniff
Server: sffe
Content-Length: 93637
X-XSS-Protection: 1; mode=block
Cache-Control: public, max-age=31536000
Age: 169036
...
注意,在該請求(指示CORS請求)的Origin
報頭的存在,並且不存在於所述響應的Access-Control-Allow-Origin
報頭。因此,即使您放入crossorigin
屬性,CORS檢查也會失敗,並且您的腳本將收到清理後的錯誤詳細信息。
有一個three-year-old issue,使谷歌CDN服務器上CORS。我不會屏住呼吸。
tldr:如果你想有意義的錯誤信息,你必須承載所有的JavaScript自己,在同一個原點。
有點什麼,我想通。我會看看我是否可以直接與受影響的用戶進行調查。謝謝。 – Pyro979
如此詳細,優秀的帖子! – potench