2013-01-02 46 views
6

我使用谷歌託管的jQuery在我的web應用程序返回什麼(//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js)作爲錯誤診斷的一部分,我有一個window.onerror處理程序,它捕獲我不在本地捕獲的任何錯誤,並讓服務器知道它們。怎麼看時,遠程腳本被阻止

到目前爲止好,但...有時候我得到的錯誤這樣的:

「腳本錯誤」, 「錯誤加載腳本」, 「意外令牌<」

我假設Google CDN在這些情況下被阻止(無論出於何種原因)。我確實有jQuery的本地回退,我相當確定它運行良好,但我想知道返回的內容,以便我可以測試我的假設,也許可以將這些用戶列入Google CDN的白名單中(如果它是公司的防火牆阻止它)。

但到目前爲止,我一直無法弄清楚如何檢索返回的內容。無法檢索SCRIPT標記的innerText(如果它是文件),由於跨域策略等原因無法執行ajax請求。

有沒有人有任何關於這將是可能的想法?

回答

11

這根本是不可能得到由<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實施,WebKitChrome

<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自己,在同一個原點。

+0

有點什麼,我想通。我會看看我是否可以直接與受影響的用戶進行調查。謝謝。 – Pyro979

+0

如此詳細,優秀的帖子! – potench