使用 python 的 lxml etree 时,XML 文件的最大大小是多少

What is the maximum size of an XML file when using python's lxml etree

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

parser = etree.XMLParser(... huge_tree=False)
xml = etree.fromstring(src, parser)

我注意到当 src 的内容超过 10Mb 时它会退出。这是 huge_tree 设置为 False 的预期行为。

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

huge_tree - disable security restrictions and support very deep trees and very long text content (only affects libxml2 2.7+)

此外,libxml 的 changelog 说:

include/libxml/parserInternals.h SAX2.c: add a new define XML_MAX_TEXT_LENGTH limiting the maximum size of a single text node, the defaultis 10MB and can be removed with the HUGE parsing option

但是我不明白这是否是硬编码的,以及为什么要做出这个选择。

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

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

10 MB 的值是任意的,这就是为什么有一个选项可以覆盖它。它似乎旨在通过要求程序员 明确请求 解析器分配尽可能多的内存(基本上 size_t) 到文本节点。

这并不能完全回答为什么 10 MB,但它似乎足够大,可以处理程序员不假思索地向解析器抛出 XML 的情况关于是否信任文件来源