如果我自己用Python腌制一个字符串,解开它是否会很危险?

问题描述 投票:2回答:2

假设我们有一个Postgres 12数据库,该数据库具有一个名为MyClass的表,该表具有一个名为notes的Text列。用户可以在此注释字段中保存所需内容。出于这个问题的目的,让我们假设他们以某种方式绕过了所有数据卫生措施。

由于obj.notes中的恶意文本,以下几行代码可能会造成危险吗?

import pickle
# (obj is a Python3 instance of MyClass using the Django ORM, so obj.notes is always represented as a unicode string)
obj = MyClass.objects.get(id=1)
pickled = pickle.dumps(obj.notes)
unpickled = pickle.loads(pickled)
python django python-3.x security pickle
2个回答
0
投票

python pickle协议(版本4)将字符串序列化为:令牌,后跟字符串的长度,后跟utf-8编码的内容。令牌是一个代码,用于标记将数据解释为字符串(并指定中间整数的数据大小)。因此,从理论上讲,所有已编码的字符串数据都将被直接复制到新的字符串对象中,而无需进行解析(不会给字符串的内容带来任何机会影响解酸机器的行为)。

这意味着即使是一个恶意字符串也应该仍然可以进行腌制和腌制,并且没有任何变化,也没有机会劫持该腌制机并运行任意代码(与腌制数据本身是否受到破坏不同)。

import pickle, pickletools
pickletools.dis(pickle.dumps("Hello World"))

有关详细信息,请参见pickletools comments

更早的版本(协议版本0),而不是指定固定的长度,协议使用了一个定界符来终止该字符串,并期望进行转义(如果在该字符串内还打算使用相同的定界符)。或者,即使使用现有协议,也可以重新实现Pickler来执行重复序列的字符串压缩。无论哪种方式,安全性都取决于您的pickle库的实现是否没有错误。


-1
投票

使用控件外部其他来源的泡菜文件非常危险,因为泡菜中可能包含代码。该代码几乎可以是任何东西,包括针对您系统的shell命令。

酸洗也不总是像您描述的那样总是安全的-将ORM类,酸洗它们,然后再酸洗它们可能会导致新类没有与数据库会话的正确链接。

在示例中,我将保存ID并使用该ID从数据库中重新加载对象。对于我想将数据移入和移出应用程序的其他情况,我建议使用pyyaml的load_safe函数或json的loads(使用默认编码器)。

© www.soinside.com 2019 - 2024. All rights reserved.