2013-01-02 8 views
6

Ich verwende von Google gehostete jQuery in meiner Webanwendung (//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js) Als Teil der Fehlerdiagnose habe ich einen window.onerror-Handler, der alle Fehler, die ich nicht lokal abfange, abfängt und den Server darüber informiert.So wird angezeigt, was zurückgegeben wird, wenn ein Remote-Skript blockiert wird

So weit so gut, aber ... manchmal bekomme ich Fehler wie diese:

"Skriptfehler", "Fehler beim Laden des Skripts", "Unexpected Token <"

Meine Annahme ist, dass das Google CDN in diesen Fällen (aus welchen Gründen auch immer) blockiert ist. Ich habe einen lokalen Fallback für jQuery, ich bin mir ziemlich sicher, dass es gut funktioniert, aber ich würde gerne herausfinden, was zurückgegeben wird, damit ich meine Annahmen testen und einige dieser Nutzer auf eine weiße Liste für Google CDN bringen kann (wenn es die Firmenfirewall ist, die es blockiert).

Aber bis jetzt konnte ich nicht herausfinden, wie der zurückgegebene Inhalt abgerufen wird. Kann innerText eines SCRIPT-Tags nicht abrufen, wenn es sich um eine Datei handelt, kann aufgrund von domainübergreifenden Richtlinien usw. keine AJAX-Anfrage stellen.

Hat jemand eine Idee, wie das möglich wäre?

Antwort

11

Es ist einfach nicht möglich, den Inhalt einer Datei zu erhalten, die von einem <script>-Tag referenziert wird. Dies hat einen guten Grund: Wenn Sie dies tun, können Sie die XHM-Richtlinien für gleiche Herkunft umgehen.

Bedenken Sie:

<script src="https://www.example.com/private/api/getAuthToken" id="s"></script> 

Wenn Sie den Text des respnse zugreifen können, Sie in der Lage sein würde, dies zu tun:

var stolenAuthToken = $('#s').text(); 

die offensichtlich schlecht ist. Daher dürfen Sie nie den Inhalt von etwas lesen, das von <script> Tags eingebracht wurde.

Ihre besondere Situation ist change durch eine vor relativ kurzer Zeit eingeführt kompliziert, wo Fehler in Cross-Origin-Skripte berichten nicht jede nützliche Informationen zu Ihrem onerror Handler Seite. (Im Wesentlichen wurde dies getan, um eine Sicherheitslücke für die Offenlegung von Informationen zu schließen, die es einer bösartigen Website ermöglicht, unter anderem zu ermitteln, ob Sie bei einigen bekannten Websites angemeldet sind.)

Dies bedeutet, dass Sie keine nützlichen Informationen erhalten über Fehler von CDN-gehostetem Skript, so wurde another change gemacht, um die Verwendung von CORS für einen CDN (oder einen anderen nicht-ursprünglichen Ursprung) -Server zu ermöglichen, um die vollständigen Fehlerdetails an einen onerror-Handler übergeben zu können.

Wir (Facebook) benötigen einen Mechanismus zum Sperren des window.onerror Muting in #363897 umgesetzt Verhalten. Unsere statischen Skriptressourcen werden auf einem CDN unter einer anderen Domäne als der Haupt-Site bereitgestellt. Da diese Domänen unterschiedlich sind, sind wir der x-Domänen-Logik nicht mehr gewachsen, die uns daran hindert, nützliche Informationen über Browserfehler zu sammeln.

Dieses "Feature" wurde in der freien Natur (in Firefox- und Webkit-Browsern) weit genug angenommen, dass die Mehrheit der nicht abgefangenen Ausnahmen, die wir in der Produktion sehen, keine verwertbaren Informationen mehr enthält.

Die crossorigin attribute (ursprünglich für <img> bestimmt) ermöglicht es Ihnen, dass eine Ressource angeben soll mit CORS Regeln geladen werden. Es wurde von Mozilla, WebKit und Chrome implementiert.

<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script> 

Leider für Sie, in meinem testing, fand ich, dass die Google CDN tut nicht CORS-Header senden.

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 

... 

Notiere die Anwesenheit des Origin Header in der Anforderung (was eine CORS Anfrage), und das Fehlen eines Access-Control-Allow-Origin Header in der Antwort. Selbst wenn Sie das Attribut crossorigin setzen, schlägt die CORS-Prüfung fehl, und Ihre Skripts erhalten bereinigte Fehlerdetails.

Es gibt eine three-year-old issue, um CORS auf dem Google CDN-Server zu aktivieren. Ich würde meinen Atem nicht anhalten.


TLDR: Wenn Sie aussagekräftige Fehlermeldungen wollen, müssen Sie alle JavaScript selbst hosten, auf dem gleichen Ursprung.

+0

irgendwie was ich dachte. Ich werde sehen, ob ich direkt mit betroffenen Benutzern nachforschen kann. Vielen Dank. – Pyro979

+0

So detailliert, ausgezeichnete Post! – potench