gpt4 book ai didi

python - 如果我自己在 Python 中 pickle 一个字符串,解封它会很危险吗?

转载 作者:行者123 更新时间:2023-12-04 10:35:05 28 4
gpt4 key购买 nike

假设我们有一个 Postgres 12 数据库,它有一个名为 MyClass 的表。有一个名为 notes 的文本列.用户可以在此备注字段中保存他们想要的任何内容。出于这个问题的目的,让我们假设他们以某种方式绕过了所有数据清理。

由于 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 pickle 协议(protocol)(版本 4)将字符串序列化为:一个标记,后跟字符串的长度,然后是 utf-8 编码的内容。 token 是一个代码,它标记数据将被解释为字符串(并指定中间整数的数据大小)。所以理论上,所有编码的字符串数据将被直接复制到新的字符串对象中而不被解析(没有机会让字符串的内容影响 unpickler 机器的行为)。

这意味着即使是恶意字符串也应该在没有任何变化的情况下进行 pickle 和解封,并且没有机会劫持解封机并运行任意代码(与 pickle 数据本身已被泄露不同)。

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

详情见 pickletools comments .

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

关于python - 如果我自己在 Python 中 pickle 一个字符串,解封它会很危险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60218149/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com