实际中HTML文档的最大深度是多少?

实际中HTML文档的最大深度是多少?,第1张

概述我想允许嵌入HTML,但是由于深度嵌套的HTML文档会使某些浏览器崩溃,从而避免使用DoS。我想能够容纳99.9%的文件,但拒绝那些嵌套太深的文档。 两个密切相关的问题: >浏览器内置什么文件深度限制?例如。浏览器X无法解析或不构建深度为>的文档。一些限制。 >文档的文档深度统计信息是否可以在网络上使用?是否有一个网站统计资料,解释说,一些百分比的真实文件在网络上的文档深度小于某些价值。 文档深度 我想允许嵌入HTML,但是由于深度嵌套的HTML文档会使某些浏览器崩溃,从而避免使用DoS。我想能够容纳99.9%的文件,但拒绝那些嵌套太深的文档。

两个密切相关的问题:

>浏览器内置什么文件深度限制?例如。浏览器X无法解析或不构建深度为>的文档。一些限制。
>文档的文档深度统计信息是否可以在网络上使用?是否有一个网站统计资料,解释说,一些百分比的真实文件在网络上的文档深度小于某些价值。

文档深度定义为1从文档中的任何节点到达文档根所需的父遍历的最大数目。例如,in

<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至少强制执行此限制。当treebuilder是created时,它接收到一个可配置的树限制:

06001

并通过block-nesting-cap测试进行测试。

解决方法 请问coderesearch@Google.com可能值得。他们从2005年( http://code.google.com/webstats/)开始的研究没有涵盖你的具体问题。他们采集了超过十亿份文件,并且有兴趣听取任何你觉得值得考虑的内容。

– [更新] –

这是一个粗糙的脚本,我写了测试我有的浏览器(把数量的嵌套到查询字符串):

var n = Number(window.location.search.substring(1));var outboundHTML = '';var inboundHTML = '';for(var i = 0; i < n; i++){    outboundHTML += '<div>' + (i + 1);    inboundHTML += '</div>';}var testwindow = window.open();testwindow.document.open();testwindow.document.write(outboundHTML + inboundHTML);testwindow.document.close();

这里是我的发现(可能具体到我的机器,Win XP,3Gb Ram):

> Chrome 9:3218嵌套元素将呈现,3129崩溃选项卡。 (Chrome 9老了,我知道,
更新程序在我的公司LAN上失败)
> Safari 5:3477将呈现,3478浏览器完全关闭。
> ie8:1000000将呈现(允许内存),尽管当滚动/移动鼠标/等时,由于事件冒泡,当高4位数字的性能下降显着。超过10000的东西似乎锁定,但我认为只是花了很长时间,所以有效的DoS。
> Opera 11:只是受到内存的限制,就我所知,即使我的脚本耗尽了内存10000000.对于大型文档,尽管如此,似乎没有像IE那样的性能下降。
> firefox 3.6:〜1500000将渲染,但测试超过此范围导致浏览器崩溃与Mozilla Crash Reporter或只是挂起,有时一个工作的数字将失败在随后的时间,但更大的数字〜1700000将直接从重新启动firefox。

更多Chrome:

将div更改为SPAN会导致Chrome在崩溃之前嵌套9202个元素。所以这不是HTML的大小(尽管SPAN元素可能更轻巧)。

嵌套2077个表格单元格(< table>< tr>< td>)工作(6231个元素),直到您向下滚动到单元格445,然后它崩溃,因此您无法嵌套445个表格单元格(1335个元素)。

使用从脚本生成的文件进行测试(而不是写入新窗口)给出略高的公差,但是Chrome仍然崩溃。

您可以在崩溃之前嵌套1409个列表项(< ul>< li>),这是有趣的,因为:

> firefox在99之后停止缩进列表项,也可能是编程约束。
>歌剧院在250,376,502,628,754,880 …中出现故障

设置DOCTYPE在ie8中有效(将其放入标准模式,即var outboundHTML =’<!DOCTYPE HTML>‘;):它不会嵌套792个列表项(标签崩溃/关闭)或1593个div。测试是从脚本生成还是从文件加载,ie8没有任何区别。

因此,浏览器的嵌套限制显然取决于攻击者注入的HTML元素的类型和布局引擎。可能会有一些比这更小的HTML。而对于ie8,Chrome和Safari用户来说,我们有一个简单的HTML DoS,其负载相当小。

看来,如果您要允许用户发布在您的一个页面上呈现的HTML,那么如果存在大量限制,那么值得考虑嵌套元素的限制。

总结

以上是内存溢出为你收集整理的实际中HTML文档的最大深度是多少?全部内容,希望文章能够帮你解决实际中HTML文档的最大深度是多少?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1115631.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存