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