Наличие интерпретаторов JavaScript в веб_броузерах означает, что загружаемая веб_страница может вызвать на исполнение произвольный JavaScript_код. Без_ опасные веб_броузеры, а наиболее распространенные современные броузеры обес_ печивают достаточный уровень безопасности, ограничивают теми или иными способами возможность исполнять сценарии, мешая злонамеренному программ_ ному коду получить доступ к конфиденциальным данным, изменить персональ_ ные данные пользователя или поставить под угрозу безопасность системы.
JavaScript – это первая линия обороны против злонамеренного кода, поэтому не_ которые функциональные возможности этим языком преднамеренно не поддер_ живаются. Например, клиентский JavaScript_код не предоставляет никакого способа записи или удаления файлов и каталогов на клиентском компьютере. Без объекта File и функций доступа к файлам JavaScript_программа не может удалять данные или разводить вирусы в пользовательской системе.
Вторая линия обороны – это наложение ограничений на некоторые поддержи_ ваемые функциональные возможности. Например, клиентский JavaScript_код способен организовать обмен с веб_серверами по протоколу HTTP и может даже загружать данные с FTP_серверов, а также серверов других типов. Однако язык JavaScript не предоставляет универсальных сетевых примитивов и не может от_ крыть сокет или принять запрос на соединение от другого хоста.
Следующий список включает в себя другие функциональные возможности, ко_ торые могут ограничиваться. Следует отметить, что это – не окончательный спи_ сок. Различные броузеры накладывают разные ограничения, причем многие из этих ограничений могут устанавливаться пользователем:
• JavaScript_программа может открыть новое окно броузера, но вследствие то_ го, что многие рекламодатели злоупотребляют этой возможностью, большин_
13.8. Безопасность в JavaScript
ство броузеров позволяют ограничить эту возможность так, чтобы всплываю_ щие окна могли появиться только в ответ на действия пользователя, такие как щелчок мыши.
• JavaScript_программа не может закрыть другое окно броузера без подтвер_ ждения пользователя, если только программа сама не открыла это окно. Это не дает злонамеренным сценариям вызвать метод self.close(), чтобы за_ крыть окно броузера и выйти из программы.
• JavaScript_программа не может скрыть адрес ссылки, который появляется в строке состояния, когда указатель мыши оказывается на ссылке. (В прошлом такая возможность была, и обычно она использовалась для предоставления до_ полнительной информации о ссылке. Многочисленные случаи жульничества и злоупотребления заставили производителей броузеров от нее отказаться.)
• Сценарий не может открыть слишком маленькое окно (размеры которого по одной стороне меньше 100 пикселов) или чрезмерно уменьшить размеры ок_ на. Аналогично сценарий не может переместить окно за пределы экрана или создать окно, превышающее размеры экрана. Это не дает сценариям откры_ вать окна, которые пользователь не может видеть или легко может не заме_ тить; такие окна могут содержать сценарии, продолжающие работать после того, как пользователь решил, что они завершились. Кроме того, сценарий не может создавать окна без заголовка, потому что такое окно может имитиро_ вать системное диалоговое окно и обманом заставить пользователя ввести, например, секретный пароль.
• Свойство value HTML_элемента FileUpload не может быть установлено. Если бы это свойство было доступно, сценарий мог бы установить его значение рав_ ным любому желаемому имени файла и заставить форму загрузить на сервер содержимое любого указанного файла (например, файла паролей).
• Сценарий не может прочитать содержимое документов с других серверов, от_ личных от сервера, откуда был получен сам документ с данным сценарием. Аналогичным образом сценарий не может зарегистрировать обработчики со_ бытий в документах, полученных с других серверов. Это предотвращает воз_ можность подсматривания данных, вводимых пользователем (таких как комбинации символов, составляющих пароль) в других страницах. Это огра_ ничение известно как политика общего происхождения (same'origin policy) и более подробно описывается в следующем разделе.