Доступен ли внешний источник JavaScript для скриптового контекста на странице HTML? - PullRequest
2 голосов
/ 09 января 2011

При обращении к внешнему файлу JavaScript,

<script type="text/javascript" src="js/jquery-1.4.4.min.js"></script>

Доступен ли источник JavaScript (строки кода перед интерпретацией) из DOM или контекста окна на текущей странице HTML? Я имею в виду использование только стандартного JavaScript без каких-либо установленных компонентов или инструментов.

Я знаю, что такие инструменты, как Firebug отслеживают внешний источник, но он установлен на платформе и, вероятно, имеет специальные возможности вне контекста песочницы браузера.

Ответы [ 2 ]

2 голосов
/ 09 января 2011

Неа. Нет Javascript API для загрузки истинного содержимого тегов <script>. На самом деле это не упущение, а скорее функция безопасности: предположим, я запрашиваю файл .json, который Gmail запрашивает через AJAX, чтобы загрузить входящие, поместив его во внешний тег <script>. Документ JSON является допустимым Javascript (предоставляется без побочных эффектов), поэтому он будет работать без ошибок. Затем, если бы я мог проверить содержимое внешнего скрипта, я смог бы прочитать вашу электронную почту. (Я почти уверен, что Gmail более сложен, чем это, но большинство сайтов нет.)

Итак, несколько слов о том, как работает Gmail, и вот как будет выглядеть атака:

<script id="inbox" type="text/javascript" src="http://mail.google.com/OMGYOURINBOX.json"></script>

<script type="text/javascript">
// Supposing a value called `externalScriptContent` existed on a script tag:
var inboxJSON = document.getElementById('inbox').externalScriptContent;
var messages = JSON.parse(inboxJSON);
for(var i in messages) {
  // Do something malicious with each e-mail message
  alert(messages[i].body);
}
</script>

Если бы тег сценария имел значение externalScriptContent, я мог бы просто ввести любой URL-адрес для src, который я хотел, и затем вызвать содержимое удаленного файла, эффективно обходя ограничения AJAX для перекрестного источника. Это было бы плохо. Мы разрешаем перекрестные запросы для удаленных сценариев, потому что они выполняются и выполняются только. Их нельзя прочитать.

Firebug имеет эти разрешения, потому что расширения Firefox имеют возможность проверять все, что запрашивает браузер; нормальных страниц, к счастью, нет.

Однако! Имейте в виду, что если скрипт находится в вашем домене, вместо того, чтобы записать его в форме <script src="…"></script>, вы можете выполнить его с помощью запроса AJAX, а затем eval, чтобы он был доступ к содержимому и до сих пор только запросить его один раз:)

1 голос
/ 09 января 2011

Вы можете проанализировать тег <script> и повторно запросить файл js по XMLHttpRequest, он, скорее всего, будет легко обслуживаться из кэша и с учетными данными текущей страницы. Но если ваш запрашивающий скрипт и скрипт в теге происходят из одного домена, браузер не допустит этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...