在我们的应用程序中,我们使用python的lxml来读取内存中的XML字符串:
parser = etree.XMLParser(... huge_tree=False)
xml = etree.fromstring(src, parser)
我注意到当src
的内容超过10Mb时它会失效。这是huge_tree
设置为False的预期行为。
我找不到的信息是:为什么10Mb?文档说:
huge_tree - 禁用安全限制并支持非常深的树 和非常长的文本内容(仅影响libxml2 2.7 +)
此外,libxml的changelog说:
include / libxml / parserInternals.h SAX2.c:添加一个新的定义 XML_MAX_TEXT_LENGTH限制单个文本节点的最大大小, 默认值为10MB,可以使用HUGE解析选项
删除
但是我不明白这是否是硬编码的,为什么这个选择有所改变。
我问的原因是我们正在处理大于此的偶然输入(例如,当存在大的二进制附件时)并且可能将该限制提高到更合理的值,而不会禁用它完全。
答案 0 :(得分:5)
10000000值是libxml的hard-coded in parserInternals.h
。该限制最初是在修复CVE-2008-4226之后不久实施的,该修复解决了极大文本节点会导致内存溢出(通过溢出可寻址内存量)的问题。
10 MB的值是任意的,这就是为什么有一个选项来覆盖它。它似乎旨在通过要求程序员显式请求解析器分配尽可能多的内存来帮助缓解libxml中内存溢出错误的漏洞而出现(基本上{{1} })到文本节点。
它并没有完全回答为什么 10 MB,但它可能看起来足够大,可以处理程序员只是在解析器上抛出XML而不考虑是否信任文件来源。