序列化與反序列化(菜雞所寫)

2021-09-26 09:04:32 字數 1300 閱讀 3999

首先,為了在php中,序列化用與儲存或傳遞php的值的過程,同時不丟失其結構和資料型別。

相關的函式包括serialize、unserialize,魔術方法包括__sleep、__wakeup。

serialize() —> 函式 用於序列化物件或陣列,並返回乙個字串。

語法:string serialize ( mixed $value )

可以對string、integer、boolean、null、array、object進行操作

unserialize() —> 函式 用於將通過 serialize()函式序列化後的物件或陣列進行反序列化,並返回原始的物件結構,如果傳遞的字串不可解序列化,則返回 false,並產生乙個e_notice

語法:mixed unserialize ( string $str )

返回的是轉換之後的值,可為integer、float、string、array或object

若被反序列化的變數是乙個物件,在成功重新構造物件之後,php會自動地試圖去呼叫__wakeup()魔術方法(如果存在的話)

php類可能會包含一些特殊的函式叫magic函式,magic函式命名是以符號__開頭的,比如 __construct, __destruct, __tostring, __sleep, __wakeup等等。這些函式在某些情況下會自動呼叫,比如__construct當乙個物件建立時被呼叫,__destruct當乙個物件銷毀時被呼叫,__tostring當乙個物件被當作乙個字串使用。這些函式只有在php**中宣告和寫入了,才會生效。

serialize()和unserialize()函式對魔術方法的處理:serialize()函式會檢查類中是否存在乙個魔術方法__sleep()。如果存在,該方法會先被呼叫,然後才執行序列化操作,此功能可以用於清理物件。

unserialize()函式會檢查類中是否存在乙個魔術方法__wakeup(),如果存在,則會先呼叫 __wakeup 方法,預先準備物件需要的資源。

__wakeup()函式失效引發漏洞(cve-2016-7124)

漏洞影響版本:

php5 < 5.6.25

php7 < 7.0.10

漏洞原理:

__wakeup 觸發於 unserilize() 呼叫之前, 當反序列化時的字串所對應的物件的數目被修改,

__wake 的函式就不會被呼叫. 並且不會重建為物件, 但是會觸發其他的魔術方法比如__destruct

這個寫的很詳細,也寫得很好:

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

序列化與反序列化

把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 eg stooges array moe larry curly new serialize stooges print r new echo print r unserial...

序列化與反序列化

序列化是將物件處理為位元組流以儲存物件或傳輸到記憶體 資料庫或檔案。其主要目的是儲存物件的狀態,以便可以在需要時重新建立物件。相反的過程稱為反序列化。通過序列化,開發人員可以儲存物件的狀態,並在需要時重新建立該物件,從而提供物件的儲存以及資料交換。通過序列化,開發人員還可以執行類似如下的操作 通過 ...