3 Апреля, 2013

Browser Security Handbook. Глава 1, пункт 7

Сергей Сторчак

 Руководство по безопасности браузеров (Browser Security Handbook). Глава 1 


7.         Объектная модель документа ( DOM )

C развитием интернета и концепции программирования на клиентской стороне, возникла потребность в HTML-документе, который должен был быть доступен программно и изменяться «на лету» в ответ на действия пользователей. Реализовать данные задачи позволяет «объектная модель документа».

Объектная модель документа ( Document Object Model ) - это не зависящий от платформы и языка программный интерфейс, позволяющий программам и скриптам получить доступ к содержимому HTML, XHTML и XML-документов, а также изменять содержимое, структуру и оформление таких документов. Например, для доступа в документе к значению первого тега <INPUT> через DOM может быть использован следующий javascript:

document.getElementsByTagName('INPUT')[0].value

Также объектная модель документа согласно определенным проверкам безопасности позволяет ссылаться сторонним документам, которые будут обсуждаться позднее ; например, следующий код получает доступ к тегу <INPUT>  во втором  <IFRAME>на текущей странице:

document.getElementsByTagName('IFRAME')[1].contentDocument.getElementsByTagName('INPUT')[0].value

Иерархия DOM-объекта, как замечено программистами, начинается с подразумеваемого корневого объекта, называемого defaultViewили глобальным; все скрипты, запускаемые на странице имеют defaultView,т.е. стандартный контекст имени (принимаемый по умолчанию). Этот корневой объект имеет следующие элементы:

- различные свойства и методы, касающиеся специфичного для текущего документа окна или фрейма . Свойства включают: размеры окна, текст строки текущего состояния, ссылки на источник, верхний уровень, и владельца (начало) defaultView-объектов. Методы разрешают скриптам изменять размеры, перемещать, изменять фокус или оформление текущих окон, выводить на экран виджеты или, как ни странно, устанавливать JavaScript-таймеры, чтобы выполнить код после определенного интервала "ожидания".
 - все текущие скрипты глобальных переменных и функций.
 - defaultView.document – высокоуровневый объект, для действующей объектной модели документа. Эта иерархия представляет все элементы документа вместе с их определенными методами и свойствами, а также объектными функциями поиска по документу, например, getElementById, getElementsByTagName, и т.д. Выбор специфичного для браузера собственного API[5] обычно присутствует поверх общей функциональности, например, document.execCommand в Internet Explorer.
 - defaultView.location - описывает текущее расположение документа, в качестве непроанализированной строки, и разделенный на проанализированные сегменты; обеспечивает методы и механизмы включения свойств, которые позволяют скриптам осуществлять переходы на другие сайты.
- defaultView.history - имеет три метода для возврата на ранее посещенные страницы.
- defaultView.screen - описывает свойства устройства отображения клиента: информацию о разрешении экрана в пикселях, dpi и т.п.
 - defaultView.navigator - содержит информацию о браузере клиента, версии операционной системы или дополнительных программных модулях (плагинах).
- defaultView.window - справочная запись, которая ссылается на корневой объект; представляет собой окно браузера,  которое создается автоматически при каждом запросе тегов <body> и <frame>.

В сочетании, элементы корневого объекта «screen», «navigator» и «windows» содержат достаточно информации для идентификации любой машины.

Действия DOM практически не отражаются на безопасности сайта, за исключением междоменных и междокументных прав доступа, описанных в последующих главах.  Однако стоит отметить, что DOM-методы представляют собой оболочки, обеспечивающие доступ для реализации внутренних структур данных, которые могут не подчиняться правилам языка JavaScript, случайно переключаться между ограниченными и ASCIZ-строками и т.д. Подобные особенности DOM могут отразиться на механизмах безопасности браузера. Некоторые такие особенностей описаны в таблице №9:

Таблица №9

Описание теста
MSIE7
MSIE8
FF3
Safari
Opera
Chrome
Android
windowтакой же объект, как и window.window?
НЕТ
НЕТ
ДА
ДА
ДА
ДА
ДА
document.URLперезаписываемый?
ДА
ДА
НЕТ
НЕТ
НЕТ
НЕТ
НЕТ
Встроенные объекты DOM могут быть затерты?
перезаписаны
перезаписаны
скопированы
скопированы
перезаписаны
перезаписаны
скопированы
getElementsByNameищет по ID=значение?
ДА
ДА
НЕТ
НЕТ
ДА
НЕТ
НЕТ
.innerHTMLобрезает нулевые значения?
ДА
НЕТ
НЕТ
НЕТ
ДА
НЕТ
НЕТ
location.*обрезает нулевые значения?
ДА
ДА
ДА
ДА
ДА
НЕТ
НЕТ
Примечание: *- возможный подход для поиска полей ввода или вывода при изменении нескольких страниц из скриптов, но это не очень практично, потому что  большинство скриптов обращаются к document.getElementById()методу для однозначной идентификации элементов, независимо от их текущего расположения на странице. Хотя для тегов в HTML-документах ID=параметр, нет гарантии, что он  будет уникальным. В настоящее время,  у основных браузеров приоритет имеет первое событие.

[5] – от application programming interface – программныйинтерфейсприложения.