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