只需停止扩展XML文件中的实体,就可以防止Billion Laughs DoS攻击。有没有办法在Python的xlrd库中执行此操作(即某种标志)?如果没有,是否有推荐的方法来避免攻击?
答案 0 :(得分:0)
目前xlrd中没有任何选项可以防止任何类型的XML炸弹。在the source code中,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是一个直接针对不同类型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模块。