如何预防"亿笑?"在Python的xlrd中进行DoS攻击?

时间:2016-02-18 01:54:05

标签: python xml xlsx xlrd client-side-attacks

只需停止扩展XML文件中的实体,就可以防止Billion Laughs DoS攻击。有没有办法在Python的xlrd库中执行此操作(即某种标志)?如果没有,是否有推荐的方法来避免攻击?

1 个答案:

答案 0 :(得分:0)

不是xlrd本身

目前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)

但是,可以使用defusedxml

修补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模块。