Dill显然是一个非常有用的模块,只要您仔细管理文件,它就相对安全了。但我被声明推迟了:
因此,dill并非旨在防止错误或恶意构造的数据。由用户决定他们解开的数据是否来自可信赖的来源。
我在https://pypi.python.org/pypi/dill读到了。它由用户决定如何管理他们的文件。
如果我理解正确,一旦被莳萝腌制,你就不能轻易地找出原始剧本在没有特殊技能的情况下会做什么。
我的问题是:虽然我没有看到警告,也存在类似的情况吗?
答案 0 :(得分:3)
Dill建立在泡菜之上,并且警告适用于腌制和莳萝一样多。
Pickle使用堆栈语言来有效地执行任意Python代码。例如,攻击者可以潜入指令以打开机器的后端。不要使用来自不受信任来源的腌制数据。
documentation包含明确警告:
警告:
pickle
模块对于错误或恶意构造的数据不安全。切勿取消从不受信任或未经身份验证的来源收到的数据。
答案 1 :(得分:2)
是强>
因为Pickle允许您通过
覆盖对象序列化和反序列化object.__getstate__()
类可以进一步影响他们的实例被腌制的方式;如果 class定义方法
__getstate__()
,它被调用并返回 对象被pickle作为实例的内容,而不是 实例字典的内容。如果__getstate__()
方法是 缺席时,实例的__dict__
像往常一样被腌制。
object.__setstate__(state)
取消排版时,如果类定义
__setstate__()
,则调用它 与未破坏状态。在这种情况下,没有要求 状态对象是字典。否则,酸洗状态必须 是一个字典,其项目分配给新实例 字典。
因为这些函数可以在用户的权限级别执行任意代码,所以编写恶意反序列化器相对容易 - 例如一个删除硬盘上的所有文件。
答案 2 :(得分:1)
虽然我没有看到警告,但是咸菜也存在类似的情况吗?
始终,始终假设只是因为某人没有说明它的危险性 安全使用。
话虽如此,Pickle docs也这么说:
警告
pickle
模块对于错误或恶意构造的数据不安全。切勿取消从不受信任或未经身份验证的来源收到的数据。
是的,那个泡菜也存在安全风险。
解释背景:pickle和dill恢复python对象的状态。在CPython中,默认的python实现,这意味着恢复包含长度字段的PyObjects
结构。作为一个例子,修改它会导致时髦的效果,并可能对你的python进程产生任意影响'存储器中。
顺便说一句,即使假设数据不是恶意的,也不意味着你可以解除或者不发送任何有关数据的信息。来自不同的python版本。所以,对我来说,这个问题有点理论上的问题:如果你需要可移植的对象,你将不得不实现一个坚如磐石的序列化/反序列化机制来传输你需要传输的数据,而不是或多或少。