2013-01-02 1 views
6

Я использую jQuery, размещенный в Google, в моем webapp (//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js) В рамках диагностики ошибок у меня есть обработчик window.onerror, который ловит любые ошибки, которые я не ловя локально, и сообщает серверу о них.Как увидеть, что возвращается, когда удаленный скрипт заблокирован

До сих пор так хорошо, но ... иногда я получаю ошибки, как это:

"Ошибка сценария", "Ошибка при загрузке сценария", "Неожиданный маркер <"

Мои предполагается, что CDN Google заблокирован в этих случаях (по любой причине). У меня есть локальный резерв для jQuery, который, я уверен, работает хорошо, но я хотел бы узнать, что возвращается, чтобы я мог проверить свои предположения и, возможно, получить некоторых из этих пользователей в белом списке для Google CDN (если это брандмауэр компании, блокирующий его).

Но до сих пор мне не удалось выяснить, как получить возвращенный контент. Не удается получить innerText тега SCRIPT, если это файл, не может выполнить запрос ajax из-за междоменной политики и т. Д.

Есть ли у кого-нибудь идеи о том, как это возможно?

ответ

11

Просто невозможно получить содержимое любого файла, на который ссылается тег <script>. Это не без оснований: это позволит вам обойти политику XHR Same Origin.

Рассмотрим:

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

Если бы вы могли получить доступ к текст respnse, вы были бы в состоянии сделать это:

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

Очевидно, что это плохо. Поэтому вам никогда не разрешается читать содержимое чего-то, что было добавлено в теги <script>.

Ваша конкретная ситуация осложняется сравнительно недавно представила change где ошибки в кросс происхождения сценариев не сообщают любой полезной информации на вашей странице onerror обработчика. (По сути, это было сделано для исправления дыры безопасности раскрытия информации, которая позволяет злоумышленнику определить, вошли ли вы на некоторые известные сайты.)

Это означает, что вы не получаете никакой полезной информации об ошибках из сценария, размещенного на CDN, поэтому было сделано another change, чтобы разрешить использование CORS для сервера CDN (или другого не одного происхождения), чтобы разрешить полную информацию об ошибке передать обработчик onerror.

Мы (Facebook) нужен механизм для отключения window.onerror приглушения поведения, реализованного в #363897. Наши ресурсы статического сценария подаются на CDN в другом домене с основного сайта. Поскольку эти домены отличаются друг от друга, мы отстаем от логики x-домена, которая мешает нам собирать полезную информацию о ошибках браузера.

Эта «функция» была достаточно широко принята в дикой природе (в браузерах Firefox и Webkit), что большинство исключений, которые мы видим в производстве, теперь не имеют в них никакой информации.

crossorigin attribute (первоначально предназначалась для <img>) позволяет указать, что ресурс должен быть загружен с правилами CORS. Он был реализован Mozilla, WebKit и Chrome.

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

К сожалению для вас, в моем testing, я обнаружил, что Google 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 

... 

Обратите внимание на наличие Origin заголовка в запросе (с указанием запроса CORS), а также отсутствие Access-Control-Allow-Origin заголовка в ответе. Таким образом, даже если вы поместите атрибут crossorigin, проверка CORS завершится неудачно, и ваши скрипты получат данные об очищенной ошибке.

Для включения CORS на сервере CDN Google существует three-year-old issue. Я бы не затаил дыхание.


tldr: Если вы хотите содержательные сообщения об ошибках, вы должны разместить все JavaScript самостоятельно, на то же происхождение.

+0

видa что я понял. Я посмотрю, могу ли я напрямую исследовать с затронутыми пользователями. Благодарю. – Pyro979

+0

Так подробно, отличный пост! – potench