Политика общего происхождения накладывает ограничения на содержимоеВсемирной паутины, с которым JavaScript_код может взаимодействовать. Обыч_ но эта политика вступает в игру, когда на одной веб_странице располагается не_ сколько фреймов, включающих теги <iframe>, или когда открываются другие ок_ на броузера. В этом случае политика общего происхождения ограничивает воз_ можность JavaScript_кода из одного окна взаимодействовать с другими фреймами или окнами. В частности, сценарий может читать только свойства окон и доку_ ментов, имеющих общее с самим сценарием происхождение (о том, как исполь_ зовать JavaScript для работы с несколькими окнами и фреймами, рассказывает_ ся в разделе 14.8).
282 Глава 13. JavaScript в веб*броузерах
Кроме того, политика общего происхождения действует при работе по протоколу HTTP с помощью объекта XMLHttpRequest. Этот объект позволяет JavaScript_сцена_ риям, исполняющимся на стороне клиента, отправлять произвольные HTTP_за_ просы, но только тому веб_серверу, откуда был загружен документ, содержащий сценарий (подробнее об объекте XMLHttpRequest рассказывается в главе 20).
Происхождение документа определяется исходя из протокола, хоста и номерапорта для URL_адреса, с которого был загружен документ. Документы, загружа_ емые с других веб_серверов, имеют другое происхождение. Документы, загру_ женные с разных портов одного и того же хоста, также имеют другое происхож_ дение. Наконец, документы, загруженные по протоколу HTTP, по происхожде_ нию отличаются от документов, загруженных по протоколу HTTPS, даже если загружены с одного и того же веб_сервера.
Важно понимать, что происхождение самого сценария не имеет никакого отно_ шения к политике общего происхождения: значение имеет происхождение до_ кумента, в который встраивается сценарий. Предположим, что сценарий из до_ мена A включается (с помощью атрибута src тега <script>) в веб_страницу из до_ мена B. Этот сценарий будет иметь полный доступ ко всему содержимому этого документа. Если этот сценарий откроет второе окно и загрузит в него документ из домена B, он также будет иметь полный доступ к содержимому этого второго документа. Но если сценарий откроет третье окно и загрузит в него документ из домена C (или даже из домена A), в дело вступит политика общего происхожде_ ния и ограничит сценарий в доступе к этому документу.
Политика общего происхождения на самом деле применяется не ко всем свойст_ вам всех объектов в окне, имеющем другое происхождение, но она применяется ко многим из них, в частности, практически ко всем свойствам объекта Document (подробности см. в главе 15). Кроме того, разные производители броузеров реа_ лизуют эту политику немного по_разному. (Например, броузер Firefox 1.0 допус_ кает вызов метода history.back() из другого окна, а IE 6 – нет.) В любом случае можно считать, что любое окно, содержащее документ, полученный с другого сервера, для ваших сценариев закрыто. Если сценарий открыл такое окно, он может закрыть его, но он никаким способом не может «заглянуть внутрь» окна.
Политика общего происхождения необходима для того, чтобы не допустить кра_ жу внутренней информации. Без этого ограничения злонамеренный сценарий (возможно, загруженный в броузер, расположенный в защищенной брандмау_ эром корпоративной сети) мог бы открыть пустое окно, в надежде обмануть пользователя и заставить его задействовать это окно для поиска файлов в ло_ кальной сети. После этого злонамеренный сценарий мог бы прочитать содержи_ мое этого окна и отправить его обратно на свой сервер. Политика общего проис_ хождения предотвращает возможность возникновения такого рода ситуаций.
Тем не менее в других ситуациях политика общего происхождения оказывается слишком строгой. Это создает особые проблемы для крупных веб_сайтов, на ко_ торых может функционировать несколько серверов. Например, сценарий с сер_ вера home.example.com мог бы на вполне законных основаниях читать свойства документа, загруженного с developer.example.com, а сценариям с orders.exam' ple.com может потребоваться прочитать свойства из документов с catalog.exam' ple.com. Чтобы поддерживать такие крупные веб_сайты, можно использоватьсвойство domain: объекта Document. По умолчанию свойство domain содержит имя
13.8. Безопасность в JavaScript
сервера, с которого был загружен документ. Это свойство можно установить только равным строке, являющейся допустимым доменным суффиксом перво_ начального значения. Другими словами, если значение domain первоначально было равно строке "home.example.com", то можно установить его равным "examp_ le.com", но не "home.example" или "ample.com". Кроме того, значение свойства do_ main должно содержать, по крайней мере, одну точку, чтобы его нельзя было ус_ тановить равным "com" или другому имени домена верхнего уровня.
Если два окна (или фрейма) содержат сценарии, установившие одинаковые зна_ чения свойства domain, политика общего происхождения для этих двух окон ос_ лабляется, и каждое из окон может читать значения свойств другого окна. На_ пример, взаимодействующие сценарии в документах, загруженных с серверов orders.example.com и catalog.example.com, могут установить свойстваdocu_ment.domain равными "example.com", тем самым указывая на общность происхож_ дения документов и разрешая каждому из документов читать свойства другого.