Как посмотреть, что возвращается, когда удаленный скрипт заблокирован

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

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

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

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

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

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

1 ответ

Решение

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

Рассматривать:

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

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

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

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

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

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

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

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

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

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

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


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

Другие вопросы по тегам