Руководство по безопасности
браузеров (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 – программный интерфейс приложения.
Комментариев нет:
Отправить комментарий