2013-01-02 45 views
6

Używam hostowanej przez Google jQuery w mojej aplikacji internetowej (//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js) W ramach diagnostyki błędów mam obsługę window.onerror, która przechwytuje wszelkie błędy, których nie łapię lokalnie i informuje o nich serwer.Jak sprawdzić, co jest zwracane, gdy zdalny skrypt jest zablokowany?

tej pory tak dobrze, ale ... czasami pojawiają się błędy takie jak:

"Script error", "skrypt Błąd ładowania", "Nieoczekiwany token <"

My zakłada się, że Google CDN jest zablokowany w tych przypadkach (z jakiegokolwiek powodu). Mam lokalny rezerwowy dla jQuery, który jestem dość pewny działa dobrze, ale chciałbym dowiedzieć się, co jest zwracane, tak, że mogę przetestować moje założenia i może dostać niektórych z tych użytkowników na białej liście dla Google CDN (jeśli blokuje go zapora firmowa).

Ale jak dotąd nie byłem w stanie dowiedzieć się, jak odzyskać zwróconą zawartość. Nie można pobrać wewnętrznego tekstu znacznika SCRIPT, jeśli jest to plik, nie można wykonać żądania ajax z powodu zasad dotyczących wielu domen itp.

Czy ktoś ma jakieś pomysły na temat tego, w jaki sposób byłoby to możliwe?

Odpowiedz

11

Po prostu nie można uzyskać zawartości dowolnego pliku, do którego odwołuje się znacznik <script>. Jest to słuszne: pozwoliłoby to na obchodzenie zasad XHR o tym samym pochodzeniu.

Rozważmy:

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

Jeśli można uzyskać dostęp do tekstu respnse, byłbyś w stanie to zrobić:

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

To oczywiście źle. Dlatego nigdy nie wolno ci czytać treści wprowadzonych przez tagi <script>.

danej sytuacji komplikuje stosunkowo niedawno wprowadzone change gdzie błędy w skryptach przekroju pochodzenia nie zgłaszają dowolny przydatnych informacji do swojej strony za onerror obsługi. (Zasadniczo zostało to zrobione, aby załatać dziurę bezpieczeństwa informacyjną, która pozwala złośliwej witrynie na stwierdzenie, czy jesteś zalogowany w niektórych znanych witrynach, między innymi.)

Oznacza to, że nie masz żadnych przydatnych informacji o błędach ze skryptu hostowanego przez CDN, więc another change zostało wprowadzone, aby umożliwić użycie CORS dla serwera CDN (lub innego serwera innego pochodzenia), aby umożliwić przekazanie szczegółowych informacji o błędzie do obsługi onerror.

My (Facebook) potrzebują mechanizm wyłączania window.onerror wyciszenia zachowanie realizowane w #363897. Nasze zasoby skryptów statycznych są dostarczane na CDN w innej domenie niż strona główna. Ponieważ te domeny różnią się, mamy do czynienia z logiką domeny x, która uniemożliwia nam zbieranie przydatnych informacji o błędach przeglądarki.

Ta "cecha" została na tyle szeroko przyjęta w środowisku naturalnym (w przeglądarkach Firefox i Webkit), że większość niezatrzymanych wyjątków, które widzimy w produkcji, nie zawiera w sobie żadnych przydatnych informacji.

crossorigin attribute (pierwotnie przeznaczony dla <img>) pozwala określić, że zasób powinien być ładowany z zasadami Cors. Został zaimplementowany przez Mozillę, WebKit i Chrome.

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

Niestety dla Ciebie, moim testing, okazało się, że Google robi CDN nie wysłać nagłówki 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 

... 

zauważyć obecność nagłówka w żądaniu (wskazywania żądania CORS) Origin i Nieobecność Access-Control-Allow-Origin nagłówka odpowiedzi. Dlatego nawet jeśli umieścisz atrybut crossorigin, sprawdzenie CORS nie powiedzie się, a twoje skrypty otrzymają szczegółowe informacje o błędach.

Istnieje three-year-old issue, aby włączyć CORS na serwerze Google CDN. Nie wstrzymałbym oddechu.


tldr: Jeśli chcesz znaczące komunikaty o błędach, trzeba zorganizować wszystkie JavaScript samodzielnie, na tym samym pochodzeniu.

+0

trochę, co wymyśliłem. Zobaczę, czy mogę zbadać sprawę bezpośrednio u użytkowników, których dotyczy problem. Dzięki. – Pyro979

+0

Tak szczegółowy, doskonały post! – potench

Powiązane problemy