Неа. Нет 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
, чтобы он был доступ к содержимому и до сих пор только запросить его один раз:)