使用python';时XML文件的最大大小是多少;s lxml-etree

使用python';时XML文件的最大大小是多少;s lxml-etree,python,lxml,libxml2,Python,Lxml,Libxml2,在我们的应用程序中,我们使用python读取内存中的XML字符串: parser = etree.XMLParser(... huge_tree=False) xml = etree.fromstring(src, parser) 我注意到当src的内容超过10Mb时,它就会退出。这是巨树设置为False时的预期行为 我找不到的信息是:为什么是10Mb?文件说: 巨树-禁用安全限制并支持非常深的树 和非常长的文本内容(仅影响libxml2.7+) 此外,libxml还表示: include/l

在我们的应用程序中,我们使用python读取内存中的XML字符串:

parser = etree.XMLParser(... huge_tree=False)
xml = etree.fromstring(src, parser)
我注意到当
src
的内容超过10Mb时,它就会退出。这是
巨树
设置为False时的预期行为

我找不到的信息是:为什么是10Mb?文件说:

巨树-禁用安全限制并支持非常深的树 和非常长的文本内容(仅影响libxml2.7+)

此外,libxml还表示:

include/libxml/parserInternals.h SAX2.c:添加新的定义 XML_MAX_TEXT_长度限制单个文本节点的最大大小, 默认值为10MB,可以通过巨大的解析选项删除

然而,我不明白这是否是硬编码的,为什么会做出这样的选择

我提出这个问题的原因是,我们正在处理偶尔大于这个值的输入(例如,当存在大型二进制附件时),也许可以将该限制提高到一个更合理的值,而不完全禁用它。

10000000值是libxml的。该限制最初是在CVE-2008-4226修复后不久实施的,该修复解决了超大文本节点会导致内存溢出(通过溢出可寻址内存量)的问题

10 MB的值是任意的,这就是为什么有一个选项可以覆盖它。它似乎旨在通过要求程序员明确请求解析器为文本节点分配尽可能多的内存(基本上是
size\u t
),来帮助减少libxml中内存溢出错误的泛滥

这并不能完全解释为什么10 MB,但它似乎足够大,足以处理程序员向解析器抛出XML而不考虑是否信任文件源的情况。

请注意,10 MB的限制不在整个XML文件上,而是在其文本节点上。