Wiki-учебник по веб-технологиям: JavaScript/БезопасностьВJavaScript ...

Главная | Каталог |

Безопасность в JavaScript

Оглавление документа

JavaScript автоматически предотвращает доступ скриптов одного сервера к свойствам документов на других серверах. Это не даёт скриптам возможность получать закрытую информацию, такую как структура директорий или история пользовательских сессий. В данной главе рассматриваются модели безопасности/security models, имеющиеся в разных релизах JavaScript.

Вот история развития безопасности 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).Только для записи: все другие свойства.
formelements
imagelowsrc, src
layersrc
locationВсе, за исключением x и y.
windowfind

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 пользователи могут добавить следующую строку в свой файл настроек:

user_pref("javascript.allow.file_src_from_non_file", true);


Соблюдайте осторожность с этой настройкой, поскольку она пробивает брешь в защите. Пользователи могут устанавливать эту настройку, только если они осознаю́т связанный с этим риск.

1.4. Проверка источника и слои


Слой/layer может иметь иной источник, нежели окружающий документ. Проверки источника осуществляются между документами и скриптами в слоях из различных источников. То есть, если документ содержит один или более слоёв, JavaScript проверяет источники этих слоёв, прежде чем они смогут взаимодействовать друг с другом или с документом-родителем.

1.5. Проверка источника и Java-аплеты


Ваша HTML-страница может содержать тэги APPLET для использования аплетов Java. Если тэг APPLET имеет атрибут MAYSCRIPT, этот аплет может использовать JavaScript. В это случае аплет является субъектом проверки источника при вызове JavaScript. Для этих целей источником аплета является URL документа, содержащего тэг APPLET.