在反序列化期间如何执行python代码?

问题描述 投票:0回答:1

我在持久性实例的背景下阅读了有关腌制的内容,并在以下代码段中进行了搜索:

Pickle文件可以被黑客入侵。如果您通过网络收到原始的泡菜文件,请不要信任它!它中可能包含恶意代码,当您尝试删除它时,它将运行任意python。 [1]

我的理解是,酸洗将数据结构转换为字节数组,而酸洗库还包含用于获取酸洗字节数组并从中重建python类的方法。

我测试了一些代码,看是否只需将代码放入类或init方法即可运行它:

import pickle

class A:
    print('class')
    def __init__(self):
        print('instance')

a = A()

print('pickling...')
with open('/home/usrname/Desktop/pfile', 'wb') as pfile:
    pickle.dump(a, pfile, pickle.HIGHEST_PROTOCOL)

print('de-pickling...')
with open('/home/usrname/Desktop/pfile', 'rb') as pfile:
    a2 = pickle.load(pfile)

但是这只会产生

class
instance
pickling...
de-pickling...

建议取消实例化时,实际上不会运行__ init__方法。所以我仍然很困惑您如何使代码在该过程中运行。

python-3.x serialization pickle
1个回答
0
投票

这里的内容非常详尽:https://intoli.com/blog/dangerous-pickles/

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