JavaScript автоматически предотвращает доступ скриптов одного сервера к свойствам документов на других серверах. Это не даёт скриптам возможность получать закрытую информацию, такую как структура директорий или история пользовательских сессий. В данной главе рассматриваются модели безопасности/security models, имеющиеся в разных релизах JavaScript.
Вот история развития безопасности JavaScript:
Во всех релизах политика same origin\одного источника является политикой по умолчанию. Эта политика ограничивает возможность получения и установки свойств, основанных на сервере документов.
JavaScript 1.1 использовал data tainting\разрушение данных при доступе к дополнительной информации.
JavaScript 1.2 заменил разрушение данных на политику signed script\маркированного скрипта. Эта политика основана на модели безопасности Java под названием object signing\маркировка объекта. Для использования политики маркированного скрипта в JavaScript вы используете специфические классы безопасности Java и маркируете ваши скрипты JavaScript.
1. Политика одного источника
Политика одного источника работает так: при загрузке документа из одного источника, скрипт, загруженный из другого источника, не может получить или установить конкретные свойства конкретного браузера и объектов HTML в окне или фрэйме.
Для обеспечения безопасности, JavaScript определяет источник как подстроку URL, которая содержит protocol://host, где host содержит не обязательный :port. Для иллюстрации, в следующей таблице даны примеры сравнения источника с URL http://company.com/dir/page.html.
URL
Результат
Причина
http://company.com/dir2/other.html
Успешно
http://company.com/dir/inner/another.html
Успешно
http://www.company.com/dir/other.html
Неудачно
Разные домены
file://D/myPage.htm
Неудачно
Разные протоколы
http://company.com:80/dir/etc.html
Неудачно
Разные порты
В следующей таблице дан список свойств, доступ к которым могут получить только те скрипты, которые прошли проверку на один источник.
Объект
Свойства – субъекты проверки
document
Для чтения и записи: anchors, applets, cookie, domain, embeds, forms, lastModified, length, links, referrer, title, URL, formName (для каждой именованной формы), reflectedJavaClass (для каждого Java-класса, отражённого в JavaScript через LiveConnect).Только для записи: все другие свойства.
form
elements
image
lowsrc, src
layer
src
location
Все, за исключением x и y.
window
find
1.1. Проверка источника document.domain
Имеется одно исключение из правила одного источника. Скрипт может устанавливать в значение document.domain суффикс текущего домена. Если это сделано, более краткий домен используется для последующих проверок источника. Например, скрипт в документе http://www.company.com/dir/other.html выполняет такой оператор:
document.domain = "company.com";
После этого страница может пройти проверку источника как http://company.com/dir/page.html.
1.2. Проверка источника именованных форм
Именованные формы являются субъектами для проверки источника.
JavaScript 1.1 и более ранние версии. Именованные формы не являются субъектами для проверки источника, хотя массив document.forms – проверяется. Чтобы исключить ошибки безопасности, возникающие при работе скриптов 1.1 в версии 1.2 или более поздней, создайте новую переменную как свойство объекта window, установив именованную форму как значение этой переменной. Вы можете затем иметь доступ к этой переменной (и, следовательно, к форме) через объект window.
1.3. Проверка источника и тэги SCRIPT, загружающие документы
Если вы загружаете документ с любым URL, кроме file:, и этот документ содержит тэг <SCRIPT SRC="...">, внутренний атрибут SRC не может обратиться к другому URL file:.
JavaScript 1.1 и более ранние версии. Если вы загружаете файл JavaScript, используя <SCRIPT SRC="...">, то URL, специфицированный в атрибуте SRC, может быть URL любого типа (file:, http: и т.д.), независимо от типа URL файла, содержащего тэг SCRIPT. Для получения поведения JavaScript 1.1 в JavaScript 1.2 пользователи могут добавить следующую строку в свой файл настроек:
Соблюдайте осторожность с этой настройкой, поскольку она пробивает брешь в защите. Пользователи могут устанавливать эту настройку, только если они осознаю́т связанный с этим риск.
1.4. Проверка источника и слои
Слой/layer может иметь иной источник, нежели окружающий документ. Проверки источника осуществляются между документами и скриптами в слоях из различных источников. То есть, если документ содержит один или более слоёв, JavaScript проверяет источники этих слоёв, прежде чем они смогут взаимодействовать друг с другом или с документом-родителем.
1.5. Проверка источника и Java-аплеты
Ваша HTML-страница может содержать тэги APPLET для использования аплетов Java. Если тэг APPLET имеет атрибут MAYSCRIPT, этот аплет может использовать JavaScript. В это случае аплет является субъектом проверки источника при вызове JavaScript. Для этих целей источником аплета является URL документа, содержащего тэг APPLET.