Какова максимальная глубина документов HTML на практике?
Я хочу разрешить встраивание HTML, но избегать DoS из-за глубоко вложенных HTML-документов, которые приводят к сбоям в некоторых браузерах. Я хотел бы иметь возможность разместить 99,9% документов, но отклонить те, которые вкладываются слишком глубоко.
Два тесно связанных вопроса:
Какие пределы глубины документа встроены в браузеры? Например. браузер X не может анализировать или не создает документы с глубиной> некоторого ограничения.Доступна ли статистика глубины для документов в Интернете? Есть ли сайт с веб-статистикой, который объясняет, что некоторый процент реальных документов в Интернете имеет глубину документа меньше некоторой ценности.Глубина документа определяется как 1 + максимальное количество родительских обходов, необходимое для достижения корня документа из любого узла в документе. Например, в
<html> <!-- 1 -->
<body> <!-- 2 -->
<div> <!-- 3 -->
<table> <!-- 4 -->
<tbody> <!-- 5 -->
<tr> <!-- 6 -->
<td> <!-- 7 -->
Foo <!-- 8 -->
максимальная глубина 8, так как текстовый узел "Foo" имеет 8 предков. Предок здесь интерпретируется не строго, то есть когда-либо узел является своим собственным предком и своим потомком.
опера имеет некоторую статистику вложенности таблиц, которая предполагает, что 99,99% документов имеют глубину вложенности таблиц менее 22, но эти данные не содержат всю глубину документа.
РЕДАКТИРОВАТЬ:
Если люди хотят критиковать библиотеку очистки HTML вместо ответа на этот вопрос, пожалуйста, сделайте это.http://code.google.com/p/owasp-java-html-sanitizer/wiki/AttackReviewGroundRules объясняет, как найти код, где найти тестовую площадку, позволяющую испытывать атаки, и как сообщать о проблемах.
РЕДАКТИРОВАТЬ:
Я спросил Адама Барта, и он очень любезно указал мне на код webkit, который обрабатывает это.
Webkit, по крайней мере, обеспечивает соблюдение этого ограничения. Когдаtreebuilder являетсясозданный он получает лимит дерева, который настраивается:
m_treeBuilder(HTMLTreeBuilder::create(this, document, reportErrors, usePreHTML5ParserQuirks(document), maximumDOMTreeDepth**(document)))
и это провереноблок-гнездования колпачок контрольная работа.