Как посмотреть, что возвращается, когда удаленный скрипт заблокирован
Я использую размещенный в 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- код в одном источнике.