2012-02-02 2 views
4

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

На моем сайте, я включаю следующий файл сценария:

<script src="http://connect.facebook.net/en_US/all.js"></script> 

Обычно, это будет работать нормально. Однако, когда я работаю, у нас есть брандмауэр, который блокирует любой трафик для доменов facebook.com или facebook.net, поскольку, очевидно, ни один сотрудник не обладает достаточным самоконтролем, чтобы не позволить себе играть в Фармвилл целый день, а не работать.

Таким образом, при загрузке сценария на самом деле получается куча HTML, в котором говорится, что сайт заблокирован. Поскольку это HTML и недействительный Javascript, браузер вызывает ошибки скрипта. Заметьте, я до сих пор получаю HTTP 200, поэтому я не могу поймать ошибки таким образом.

Я согласен с тем, что это край, потому что только небольшой процент пользователей будет пытаться получить доступ к моему сайту из-за брандмауэра, который блокирует трафик Facebook, но мне все еще интересно, есть ли что-то относительно легко я могу сделать тест, чтобы убедиться, что ссылка возвращает действительный Javascript, или, возможно, окружает загрузку скрипта в гигантском блоке try/catch и грамотно обрабатывает ошибки. Любые идеи были бы высоко оценены!

UPDATE:

Вот HTTP-заголовки из страницы ошибок брандмауэра. Возможно, я могу посмотреть заголовок «content-type», который, как я полагаю, будет text/javascript, если контент был действительным.

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: text/html; charset=utf-8 
Proxy-Connection: Keep-Alive 
Connection: Keep-Alive 
Content-Length: 4774 
+0

Не могли бы вы получить скрипт с запросом AJAX «GET» и убедиться, что он не начинается с разметки HTML? – Pointy

+0

или, возможно, вы можете проверить, перезаписаны ли какие-либо заголовки ответа некоторыми настройками брандмауэра. – fcalderan

+0

Всегда ли длина ответа 4774 байта, когда этот ресурс заблокирован? Каково содержание ответа? – fcalderan

ответ

1

К сожалению, вы не можете проверить, что connect.facebook.net не блокируется, поскольку он подается от другого Origin, чем ваш документ.

Это означает, что вы не можете использовать XHR выдать HEAD запрос и убедитесь, что тип контента действительно text/javascript – XHR не будет делать запрос на кросс-Origin по умолчанию, и connect.facebook.сеть не поддерживает CORS:

OPTIONS http://connect.facebook.net/en_US/all.js HTTP/1.1 
Host: connect.facebook.net 
Access-Control-Request-Method: GET 
Access-Control-Request-Headers: Origin, X-Requested-With, Accept 

HTTP/1.1 501 Not Implemented 
Server: AkamaiGHost 
Mime-Version: 1.0 
Content-Type: text/html 
Content-Length: 272 
Connection: close 

Технически говоря, фильтрующее программное обеспечение/брандмауэр вопрос неверен в том, что, когда он блокирует сайт, он обеспечивает код состояния успеха (200), когда он должен предоставлять ошибку код (4xx или 5xx). Если он правильно ответил с условием ошибки, browswer не будет анализировать тело ответа как скрипт (тем самым вызывая ошибки).

1

Это, как это делается запасной вариант:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script> 
<script>window.jQuery || document.write("<script src='js/libs/jquery-1.6.4.min.js'>\x3C/script>")</script> 

В этом случае, он пытается загрузить JQuery из googleapis.com. Если он заблокирован или недоступен, он загружает локальный jQuery.

Вы можете использовать ту же технику. Сделайте второй скрипт, чтобы определить, загружен ли файл сценария facebook. Если он не загружен, не запускайте с ним какой-либо связанный скрипт.

+0

Я думаю, что первое включение скрипта порождает ошибки в любом случае (если я хорошо понял) – fcalderan

+0

Согласовано - это отличный способ отбросить и загрузить скрипт из другого места, но он все равно будет всплывать с синтаксическими ошибками. –

+0

Я думаю, что если не указано протокол в src тега скрипта, может возникнуть проблема с навигаторами, что по умолчанию протокол не является http. – Jack

1

Глядя на ваши изменениях, вы можете проверить с помощью AJAX типа содержимого ответа и когда это text/html не присоединяет сценарий: использовать <xhr>.getResponseHeader("Content-Type");

Edit: Как josh3736 указал, запрос Межсайтового не разрешено через javascript, поэтому вам также потребуется вызвать внутренний ресурс (написанный на языке сервера), который работает как прокси-сервер и пытается получить скрипт, возвращая его тип содержимого (например, посмотрите на это обсуждение: php, curl, headers and content-type)

+0

Я займусь этим и посмотрю, смогу ли я что-нибудь придумать. Я использую структуру YUI2, которая имеет различные утилиты для такого рода вещей. –

+0

getResponseHeader() - это javascript-метод объекта xmlHttpRequest. Итак, имея свой * xhr * объект, вы можете использовать его везде, независимо от того, что ваша библиотека – fcalderan

+0

Это не сработает. XHR не разрешает запросы Cross-Origin. – josh3736

Смежные вопросы