如何在 Python 的 xlrd 中防止 "billion laughs" DoS 攻击?
How to prevent "billion laughs" DoS attack in Python's xlrd?
Billion Laughs DoS 攻击似乎可以通过简单地阻止扩展 XML 文件中的实体来预防。在 Python 的 xlrd 库中有没有办法做到这一点(即某种标志)?如果没有,是否有推荐的避免攻击的方法?
不单独使用 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 炸弹的安全问题的软件包。来自文档:
Instead of:
from xml.etree.ElementTree import parse
et = parse(xmlfile)
alter code to:
from defusedxml.ElementTree import parse
et = parse(xmlfile)
同时提供标准库补丁功能。因为这就是 xlrd 正在使用的,您可以使用 xlrd 和 defusedxml 的组合来读取 Excel 文件,同时保护自己免受 XML 炸弹。
Additionally the package has an untested function to monkey patch all stdlib modules with defusedxml.defuse_stdlib().
Billion Laughs DoS 攻击似乎可以通过简单地阻止扩展 XML 文件中的实体来预防。在 Python 的 xlrd 库中有没有办法做到这一点(即某种标志)?如果没有,是否有推荐的避免攻击的方法?
不单独使用 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 炸弹的安全问题的软件包。来自文档:
Instead of:
from xml.etree.ElementTree import parse et = parse(xmlfile)
alter code to:
from defusedxml.ElementTree import parse et = parse(xmlfile)
同时提供标准库补丁功能。因为这就是 xlrd 正在使用的,您可以使用 xlrd 和 defusedxml 的组合来读取 Excel 文件,同时保护自己免受 XML 炸弹。
Additionally the package has an untested function to monkey patch all stdlib modules with defusedxml.defuse_stdlib().