標簽:程序 寫入文件 漏洞 代碼執行 內置函數 對象 gets 取出 情況
pickle 模塊可以對一個 Python 對象的二進制進行序列化和反序列化。說白了,就是它能夠實現任意對象與二進制直接的相互轉化,也可以實現對象與文本之間的相互轉化。
比如,我程序里有一個 python 對象,我想把它存到磁盤里,于是我用 pickle 把他轉到一個文本里。當后面我想使用的時候,讀取出來時候依然是一個 python 對象。
pickle 模塊提供了以下 4 種方法:
將 Python 中的對象序列化成二進制對象,并直接返回。
示例
import pickle
test_list = ["pingguo", {1, 2, 3}, None]
# 使用 dumps() 函數將 test_list 轉成 p1
p1 = pickle.dumps(test_list)
print(p1)
print("返回類型:", type(p1))
輸出結果:
b‘\x80\x03]q\x00(X\x07\x00\x00\x00pingguoq\x01cbuiltins\nset\nq\x02]q\x03(K\x01K\x02K\x03e\x85q\x04Rq\x05Ne.‘
返回類型: <class ‘bytes‘>
讀取給定的二進制對象數據,并將其轉換為 Python 對象。
示例
在上面的基礎上繼續:
import pickle
test_list = ["pingguo", {1, 2, 3}, None]
# 使用 dumps() 函數將 test_list 轉成 p1
p1 = pickle.dumps(test_list)
print(p1)
print("返回類型:", type(p1))
# 使用 loads() 函數將 p1 轉成 Python 對象 p2
p2 = pickle.loads(p1)
print(p2)
print("返回類型:", type(p2))
輸出結果:
b‘\x80\x03]q\x00(X\x07\x00\x00\x00pingguoq\x01cbuiltins\nset\nq\x02]q\x03(K\x01K\x02K\x03e\x85q\x04Rq\x05Ne.‘
返回類型: <class ‘bytes‘>
[‘pingguo‘, {1, 2, 3}, None]
返回類型: <class ‘list‘>
pickle 反序列化后的對象與原對象是等值的副本對象,類似deepcopy。
將 Python 中的對象序列化成二進制對象,并寫入文件。
示例
import pickle
test_list = ["pingguo", {1, 2, 3}, None]
with open("test_pickle.txt", "wb") as f:
# 使用 dump() 函數將 test_list 轉成 p1,寫到txt文本里
pickle.dump(test_list, f)
注意這里的寫文件是 "wb",以二進制格式打開一個文件只用于寫入,否則會報錯。
執行成功后,同級目錄下生成一個test_pickle.txt
文件,因為是二進制內容,直接打開看到的是亂碼。
讀取指定的序列化數據文件,并返回對象。
示例
import pickle
test_list = ["pingguo", {1, 2, 3}, None]
with open("test_pickle.txt", "wb") as f:
# 使用 dump() 函數將 test_list 轉成 p1,寫到txt文本里
pickle.dump(test_list, f)
with open("test_pickle.txt", "rb") as f:
# 將二進制文件對象轉換成 Python 對象 p3
p3 = pickle.load(f)
print(p3)
print("類型:", type(p3))
注意,這里讀取文件用rb
,也就是以二進制格式打開一個文件用于只讀。
執行成功。
[‘pingguo‘, {1, 2, 3}, None]
類型: <class ‘list‘>
下列類型可以被封存:
python 提供的 json 標準庫相信大家都熟悉,提供的方法也與 pickle 相似,那么兩者有什么區別呢?
關于最后一點,說的是 pickle 模塊并不安全。很有可能你去解封的是惡意構建的 pickle 數據,造成解封時執行了惡意代碼,所以要慎用。
標簽:程序 寫入文件 漏洞 代碼執行 內置函數 對象 gets 取出 情況
原文地址:https://www.cnblogs.com/pingguo-softwaretesting/p/15063288.html