HTML の埋め込みを許可したいが、一部のブラウザーをクラッシュさせる深くネストされた HTML ドキュメントによる DoS を回避したい。99.9% のドキュメントに対応できるようにしたいのですが、入れ子が深すぎるドキュメントは拒否します。
2 つの密接に関連する質問:
- ブラウザーに組み込まれているドキュメントの深さの制限は? たとえば、ブラウザ X は解析に失敗するか、深さ > 制限のあるドキュメントを構築しません。
- 文書の文書深度統計は Web 上で入手できますか? Web 上の実際のドキュメントの一部のドキュメントの深さがある値よりも小さいことを説明する Web 統計のサイトはありますか。
ドキュメントの深さは、1 + ドキュメント内の任意のノードからドキュメント ルートに到達するために必要な親トラバーサルの最大数として定義されます。たとえば、
<html> <!-- 1 -->
<body> <!-- 2 -->
<div> <!-- 3 -->
<table> <!-- 4 -->
<tbody> <!-- 5 -->
<tr> <!-- 6 -->
<td> <!-- 7 -->
Foo <!-- 8 -->
テキスト ノード "Foo" には 8 つの祖先があるため、最大深度は 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テストによってテストされます。