我希望允许嵌入 HTML,但由于深度嵌套的 HTML 文档会导致某些浏览器崩溃,因此要避免 DoS。我希望能够容纳 99.9% 的文档,但拒绝那些嵌套太深的文档。
两个密切相关的问题:
- 浏览器内置了哪些文档深度限制?例如,浏览器 X 无法解析或无法构建深度 > 某些限制的文档。
- 网络上是否提供文档的文档深度统计信息?是否有一个提供网络统计数据的网站解释说网络上某些百分比的真实文档的文档深度小于某个值。
文档深度定义为 1 + 从文档中的任何节点到达文档根所需的最大父遍历次数。例如,在
<html> <!-- 1 -->
<body> <!-- 2 -->
<div> <!-- 3 -->
<table> <!-- 4 -->
<tbody> <!-- 5 -->
<tr> <!-- 6 -->
<td> <!-- 7 -->
Foo <!-- 8 -->
最大深度为 8,因为文本节点“Foo”有 8 个祖先。这里的祖先是非严格解释的,即每个节点都是它自己的祖先和它自己的后代。
Opera有一些表格嵌套统计数据,这表明 99.99% 的文档的表格嵌套深度小于 22,但该数据不包含整个文档深度。
编辑:
如果人们想批评 HTML 清理库而不是回答这个问题,请这样做。 http://code.google.com/p/owasp-java-html-sanitizer/wiki/AttackReviewGroundRules解释了如何查找代码、在哪里可以找到可让您尝试攻击的测试平台以及如何报告问题。
编辑:
我问过 Adam Barth,他非常友好地向我指出了处理这个问题的 webkit 代码。
至少,Webkit 强制执行此限制。创建树构建器时,它会收到一个可配置的树限制:
m_treeBuilder(HTMLTreeBuilder::create(this, document, reportErrors, usePreHTML5ParserQuirks(document), maximumDOMTreeDepth**(document)))
并通过block-nesting-cap测试进行测试。