python-3.x - 如何在反序列化期间执行 python 代码?
问题描述
我正在阅读有关持久实例上下文中的酸洗的信息,并遇到了这个片段:
Pickle 文件可以被黑客入侵。如果您通过网络收到原始 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__ 方法在实例未腌制时实际上并没有运行。所以我仍然很困惑如何在该过程中运行代码。
解决方案
在这里写得很透彻:https ://intoli.com/blog/dangerous-pickles/
据我了解,这与泡菜机(PM)如何解释泡菜并运行有关。您可以制作一个 pickle 文件,使其使用eval()
提供的语句进行评估。
推荐阅读
- java - 将 JRadioButtons 与 derby 数据库一起使用
- mysql - MYSQL - 使用 IN 子句检索金额
- xamarin.android - 使用 StaggeredGridLayoutManager 时的小图像
- c - 如何使用多个处理器对 N 个数字求和?
- c++ - 如何在 VIsual Studio Commun2019 中编辑我的 Windows 桌面应用程序主对话框?
- javascript - 动态创建的表格 - 仅限原版 Javascript - 不在浏览器中显示
- android - 无法在 React Native 中的图像滑块中获取和显示图像
- xamarin.forms - Xamarin.Forms - 在没有导航栏的情况下更改状态栏颜色
- clojure - 如何过滤地图并将其与另一个集合进行比较
- vue.js - VuePress 使用无效的资产地址构建损坏的 html