IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  XML  >

О будущем защищенных Ajax mashup-приложений

Как улучшить браузер для гибридных Web-приложений

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Брент Эшли, президент, Ashley IT Services, Inc.

17.12.2007

Современные Web-браузеры не предназначались для того, чтобы легко и безопасно получать содержимое страницы из нескольких источников. Узнайте, как разработчики применили доступные инструментальные средства для решения данной задачи, и как это отразилось на защищенности и масштабируемости получившихся приложений. Также познакомьтесь с несколькими улучшениями браузеров, предложенными для исправления ситуации, и узнайте, как стать участником обсуждения, которое поможет Web-разработке преодолеть этот барьер и выйти на новый уровень функциональной совместимости.

Смешивание при помощи Ajax

Mashup - это Web-приложение, интегрирующее содержимое из нескольких источников и представляющее его на одной странице. Сервер выполняет запросы к каждому источнику содержимого, анализирует получаемую информацию и объединяет результаты на странице для передачи в браузер, как показано на рисунке 1.


Рисунок 1. Смешивание содержимого из нескольких источников
Рисунок 1. Смешивание содержимого из нескольких источников

Ajax-приложение (Asynchronous JavaScript + XML) позволяет Web-странице получать содержимое от сервера и обновлять себя асинхронно, используя JavaScript™-код, как показано на рисунке 2. Таким способом пользователи могут взаимодействовать с полнофункциональным пользовательским интерфейсом (user interface - UI) без перезагрузки всей страницы. Сервер передает начальную страницу в браузер, который запрашивает сервер для получения обновленного содержимого страницы. Асинхронный JavaScript-код часто использует XML для кодирования данных, однако распространены и другие форматы данных, такие как JavaScript Object Notation (JSON), HTML и текст с разделителями.


Рисунок 2. Интерактивное отображение данных при помощи Ajax
Рисунок 2. Интерактивное отображение данных при помощи Ajax

Ajax mashup - это гибридное Web-приложение. Оно использует Ajax-технологии для предоставления полнофункционального UI, обновляющего себя при помощи содержимого, извлекаемого асинхронно из нескольких источников. Сервер передает в браузер начальную страницу, которая затем формирует вызовы для извлечения обновленного содержимого. Эти вызовы могут быть сделаны напрямую сторонним источникам из браузера, либо поступать на сервер, который работает как прокси для стороннего содержимого.



В начало


Круглые гвозди, квадратные дырки

Когда разрабатывались элементы современных браузеров, Ajax mashup-приложений еще не было и в помине. В браузеры, HTTP-протокол (Hypertext Transfer Protocol), HTML или XHTML не было встроено ничего, специально предназначенного для адаптации браузеров к безопасному и надежному асинхронному извлечению содержимого из нескольких источников. Некоторые функциональные возможности в HTTP-спецификациях World Wide Web Consortium (W3C), которые можно было бы использовать для mashup (например, Document Object Model (DOM) Level 3 Load and Save Specification), в большинстве браузеров были реализованы не полностью либо не реализованы вообще.

Dynamic HTML (DHTML) изначально не использовался с динамически извлеченным содержимым. Элементы представления и элементы данных динамической Web-страницы, а также сценарии для работы с ними доставлялись все вместе. Сценарии могли отображать, скрывать, перемещать, создавать и уничтожать объекты документа для создания динамических эффектов, но каждый раз, когда нужны были новые данные от сервера, страница полностью заменялась новой. Поток данных был синхронизирован с перезагрузкой страницы.

Поэтому разработчики, хотевшие создавать гибридные Web-приложения, которые мы теперь называем словом mashup, должны были взять доступную технологию и найти способы приспособить ее для своих нужд. Было разработано два подхода, позволяющие браузеру извлекать содержимое без перезагрузки страницы: встраивание внешнего транспортного механизма и использование родных браузеру объектов для выполнения транспортных обязанностей.

Помощь извне

Одним из ранних решений стал механизм Microsoft Remote Scripting, который использовал Java™-апплет, обменивавшийся сообщениями в XML-формате с серверными компонентами. Этот подход быстро стал громоздким из-за споров производителей, а также из-за различий в Java Virtual Machine (JVM) и моделях защиты.

Позднее Microsoft создал объект XMLHttpRequest (XHR), разработчики которого ожидали, что он будет использоваться только с Microsoft® Outlook® Web Access (OWA). Этот объект был поначалу доступен только для пользователей Windows® Internet Explorer® и использовался нечасто, пока через несколько лет его не реализовали Mozilla и Safari. Первоначально внешний объект Microsoft ActiveX® в современных реализациях является родным объектом браузеров. Несмотря на свое название, XHR-объект может передавать данные в любом формате и не ограничен только корректным XML.

Многие разработчики используют функциональные возможности XML-коммуникации программы Macromedia Flash для создания встраиваемых компонентов, взаимодействующих с сервером. Объекты XMLSocket и flex.net.socket предоставляют возможности, аналогичные XHR, но с дополнительными возможностями управления коммуникацией и синтаксического анализа XML.

Внутренняя работа

Из-за проблем и зависимостей, связанных с внешними транспортными механизмами, Интернет-сообщество разработчиков начало сотрудничать для развития и разработки нескольких родных для браузера методов удаленного вызова.

  • Использование скрытого элемента iframe для загрузки внешнего содержимого: Затем к iframe обращаются через DOM для извлечения содержимого из загруженного документа. Можно указать любые параметры в URL строки запроса или динамически создать форму, передающую данные в сервис с iframe в качестве назначения. Этот метод поддерживается разнообразными современными и более старыми браузерами.
  • Использование элемента img для передачи запросов на получение содержимого: Сервер выполняет свою задачу, используя параметры из URL строки запроса, а затем возвращает закодированное содержимое в куки. Этот метод ограничен в количестве данных, которыми можно обмениваться, поскольку строка запроса и куки ограничены в размерах.
  • Динамическое создание элемента script в DOM текущей страницы: При загрузке предоставленный сервером код выполняется немедленно. Сервер использует параметры из URL строки запроса.

Ссылки на подробную информацию по этим программам и техническим приемам приведены в разделе "Ресурсы".



В начало


Преодолевая границы

Большинство из доступных технологий для асинхронного извлечения содержимого наследует модель защиты JavaScript, которая позволяет сценариям взаимодействовать только с элементами, находящимися на том же сервере, что и страница, которой принадлежит сценарий. Это политика Same Origin Policy (политика единого происхождения), которую реализуют все браузеры.

Для того чтобы Web-страница извлекала содержимое из сторонних источников, нужно обмануть политику Same Origin Policy. Обычно используемым исключением, не ограниченным политикой Same Origin Policy, является тег <script>, посредством которого элемент <script> добавляется в дерево объектов DOM страницы, заставляя ее загружать и выполнять код, находящийся в URL, указываемом атрибутом src этого элемента.

Использование тега <script> для выполнения сценариев нескольких сайтов предполагает высокий уровень доверия между всеми участвующими сайтами, поскольку все эти сценарии выполняются в одном и том же контексте и, таким образом, могут получить доступ к информации и куки других сайтов.



В начало


Защищенность или масштабируемость: Нельзя иметь то и другое одновременно

За обходные пути, широко используемые для обеспечения возможности работы Ajax mashup-приложений, приходится чем-то платить. Преодолевая границы ограничений браузеров, вы воздействуете на другие аспекты общего функционирования приложения. При этом приложение становится либо менее защищенным, либо менее масштабируемым.

Защищен, но масштабируем?

При ограничении политикой браузера Same Origin Policy, тот же сервер, на котором размещено приложение, должен взять на себя работу по извлечению стороннего содержимого и передачи его клиенту. Сервер выступает в качестве клиента стороннего сервиса в дополнение к своим обычным функциям.

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

Масштабируем, но защищен?

Использование тега <script> для обхода политики Same Origin Policy позволяет клиенту извлекать содержимое из сторонних источников. Эта функциональная возможность устраняет серверную проблему масштабируемости, поскольку каждый дополнительный клиент сам забирает содержимое.

Преимущества масштабируемости с тегом <script> предоставляются путем обмана модели защиты Same Origin Policy, что может сказаться на уязвимости для атак:

  • Становится возможен межсайтовый доступ к куки: Сценарии одного сайта могут получить доступ к куки другого сайта.
  • Нет возможности контролировать извлеченный код на безопасность перед его выполнением: Код выполняется сразу после загрузки.


В начало


Возможные решения

Очевидно, что инструментальных средств, предоставляемых в настоящее время браузерами для mashup-приложений, недостаточно для создания приложений, которые были бы и масштабируемыми, и защищенными. Разработчики должны найти решения, которые работали бы и сейчас, и в долгосрочной перспективе.

Здесь и сейчас

Недавно разработанная методика извлечения содержимого использует взаимодействие между сценарием страницы и скрытым iframe через идентификатор фрагмента URL его атрибута src (часть URL, которая находится после знака #). Сценарии на родительской странице и во встроенном iframe могут устанавливать идентификаторы фрагмента друг друга, несмотря на то, что имеют разное происхождение. Между сценариями поддерживается согласованный протокол взаимодействия, управляемый JavaScript-таймерами, которые периодически выполняют процедуры для проверки изменений в индикаторах фрагментов.

Поскольку сценарии должны знать адреса друг друга и договориться между собой о протоколе, доверие гарантируется. Так как каждое взаимодействие сервера является локальным для каждого компонента и отделенным от межсценарного взаимодействия, куки не показываются.

Хотя это решение все еще не совершенно (например, оно основывается на аномалии, которая не является запланированным поведением, и опрос изменений хуже активизации события в ответ на изменение), оно лучше остальных решений подходит к реализации естественного для браузера, защищенного, встроенного в страницу, междоменного взаимодействия.

Примечание: Джеймс Бурке (James Burke), разработчик из AOL Developer Network, первым начал использовать методику передачи идентификатора фрагмента и встроил ее в последние версии библиотеки Dojo Toolkit JavaScript.

Перспективы

Производители браузеров и сообщество разработчиков обсуждают несколько возможных путей изменения элементов среды браузера, для того чтобы приспособить их для работы с Ajax mashup-приложениями. Web Hypertext Application Technology Working Group (WHATWG) предложила в разделе 7.3 своего документа Web Applications 1.0 Working Draft механизм, называемый Cross Document Messaging. Браузер Opera уже реализует эту функциональность. Данный механизм определяет метод взаимодействия между DOM-объектами из различных доменов, позволяющий получателю выбирать, на какие сообщения отвечать, основываясь на их происхождении.

Ян Хиксон (Ian Hickson) (работавший в Opera, а сейчас в Google) предложил межсайтовые расширения существующего объекта XMLHttpRequest. Его предложение заключается в нескольких изменениях способа выполнения запросов, включая ограничения в управлении заголовком и механизм управления доступом.

Дуглас Крокфорд (Douglas Crockford), пропагандист JavaScript и разработчик в Yahoo!, является одним из общепризнанных в мире экспертов в языке JavaScript. Можно найти множество презентаций и статей, объясняющих сложные приемы работы с JavaScript на его персональном Web-сайте и на Yahoo! Developer Network. Еще одной инициативой, которую продвигает Крокфорд, является JSON, формат обмена данными, который широко используется в Ajax-приложениях, в основном потому, что он готов к работе в JavaScript и менее многословен по сравнению с XML. Крокфорд внес два предложения по встраиванию в браузеры элементов для mashup-приложений.

Нереализованные предложения

Существует несколько предложений, помогающих решить эту задачу:

  • JSONRequest: Браузеры реализуют новый объект, который работает почти так же, как существующий объект XMLHttp, но с несколькими изменениями:
    • JSONRequest не ограничивался бы политикой Same Origin Policy.
    • Использовался бы минимальный набор HTTP-заголовков для уменьшения общего размера запросов.
    • Не передавались бы куки, что устранит проблемы межсайтовых куки.
    • JSONRequest принимал бы только корректный JSON-текст, что гарантировало бы невозможность передачи для выполнения необработанного (raw) исполняемого кода.
    • После аварийного прекращения взаимодействия вводятся случайные задержки перед повторными попытками для препятствия проведению атак определенного класса.
    • Каждый запрос возвращал бы упорядоченный идентификатор, что позволило бы легко связывать асинхронные ответы с их оригинальными запросами.
    • Специальная поддержка дуплексных соединений позволила бы серверу асинхронно инициировать взаимодействия через открытый коммуникационный канал.
  • Тег <module>: Новый HTML-тег разделяет страницу на набор модулей, защищенных друг от друга, но способных надежно взаимодействовать:
    • Тег <module> мог бы иметь возможность обращаться к сторонним ресурсам, не будучи ограниченным политикой Same Origin Policy.
    • Совместное взаимодействие между страницей и модулем было бы возможно только через специальные интерфейсы. Модули не могли бы взаимодействовать друг с другом, а только со страницей. Страница может содействовать взаимодействию между модулями.
    • Взаимодействие было бы ограничено корректным JSON-текстом, в отличие от взаимодействия JavaScript-объектов, могущего вызвать уязвимость в системе защиты через присоединенный код.
    • Предлагаются ограничения для запрета модулям и страницам интерферировать с выводом друг друга, вызывая проблемы защиты.
  • Заголовок ограничений содержимого (Content restrictions header): Джервейс Маркхэм (Gervase Markham) предлагает спецификацию заголовка ограничений содержимого, который позволил бы авторам высказывать все пожелания о том, как их содержимое должно взаимодействовать с содержимым других сайтов. Совместимая реализация передавала бы этот заголовок, содержащий строку политики.
  • W3C Access Control List (ACL) System: W3C ACL System могла бы использоваться как модель для основанной на ACL системы по управлению доступом к HTTP-ресурсам в Ajax mashup-приложениях.
  • Cross-domain.xml: Flash-объекты ищут файл cross-domain.xml на сервере перед попыткой получить доступ к указанному в них URL. Этот файл указывает, какие сайты могут размещать приложения, имеющие доступ к сервисам, предоставляемым на этом сервере. Многие провайдеры Web-сервисов уже реализовали этот файл.

Ссылки на подробную информацию по этим предложениям приведены в разделе "Ресурсы".



В начало


Помогите определить будущее

Являясь разработчиками, все мы кровно заинтересованы в исходе этих дискуссий. Присоединившись к обсуждению, вы можете помочь разработать наиболее гибкие и в то же время защищенные улучшения для браузеров, которые позволят создавать надежные и защищенные полнофункциональные Web-приложения. Я советую отыскать производителей браузеров и организации, дающие рекомендации по направлениям развития браузеров, и:

  • Присоединиться к отраслевым сообществам и рабочим группам.
  • Взаимодействовать с производителями браузеров и инструментальных средств в новостных группах и на форумах.
  • Найти и заинтересовать ключевые фигуры данной отрасли.

Ссылки для начала работы можно найти в разделе "Ресурсы" данной статьи.



Ресурсы

Научиться

Получить продукты и технологии

Обсудить


Об авторе

Брент Эшли (Brent Ashley) работает консультантом и специалистом по сценариям в Торонто. Занимаясь компьютерами и технологией с 1979 года, он является активным разработчиком и пропагандистом методик создания полнофункциональных Web-приложений, таких как Ajax и удаленное выполнение сценариев, с 1999 года. Брент рассматривает технические темы в своем блоге. Связаться с ним можно по адресу brent@ashleyit.com.




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



ДаНетНе знаю
 


 


12345
 


В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.

    IBM в России Конфиденциальность Контакты