3

Billion Laughs DoS 攻击似乎可以通过简单地阻止扩展 XML 文件中的实体来预防。有没有办法在 Python 的 xlrd 库中做到这一点(即某种标志)?如果没有,是否有推荐的方法来避免攻击?

4

1 回答 1

1

不是 xlrd 本身

目前 xlrd 中没有用于防止任何类型的 XML 炸弹的选项。在源代码中,xlsx 数据被传递给 python 的内置xml.etree进行解析,无需任何验证:

import xml.etree.ElementTree as ET

def process_stream(self, stream, heading=None):
        if self.verbosity >= 2 and heading is not None:
            fprintf(self.logfile, "\n=== %s ===\n", heading)
        self.tree = ET.parse(stream)

但是,可以ElementTree使用 defusedxml进行修补

如评论中所述,defusedxml是一个直接针对不同类型 XML 炸弹的安全问题的包。从文档:

代替:

from xml.etree.ElementTree import parse
et = parse(xmlfile)

将代码更改为:

from defusedxml.ElementTree import parse
et = parse(xmlfile)

它还提供了修补标准库的功能。由于这就是 xlrd 所使用的,因此您可以使用 xlrd 和 defusedxml 的组合来读取 Excel 文件,同时保护自己免受 XML 炸弹的伤害。

此外,该包还有一个未经测试的功能,可以使用 defusedxml.defuse_stdlib() 对所有 stdlib 模块进行猴子修补。

于 2016-04-26T21:18:46.673 回答