Руководство по безопасности браузеров (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 – программныйинтерфейсприложения.
[5] – от application programming interface – программныйинтерфейсприложения.