PHP序列化及反序列化分析學習小結
- 2020 年 4 月 6 日
- 筆記
PHP反序列化
最近又遇到php反序列化,就順便來做個總結。
0x01 PHP序列化和反序列化
php序列化:php對象 序列化的最主要的用處就是在傳遞和保存對象的時候,保證對象的完整性和可傳遞性。序列化是把對象轉換成有序位元組流,以便在網絡上傳輸或者保存在本地文件中。序列化後的位元組流保存了php對象的狀態以及相關的描述信息。序列化機制的核心作用就是對象狀態的保存與重建。
php反序列化:php客戶端從文件中或網絡上獲得序列化後的對象位元組流後,根據位元組流中所保存的對象狀態及描述信息,通過反序列化重建對象。
簡單來說,序列化就是把實體對象狀態按照一定的格式寫入到有序位元組流,當要用到時就通過反序列化來從建對象,恢復對象狀態,這樣就可以很方便的存取數據和傳輸數據。
序列化例子:
<?php class test{ public $name = 'lu'; private $name2 = 'lu'; protected $name3 = 'lu'; } $test1 = new test(); $object = serialize($test1); print_r($object); ?>
最後輸出:O:4:"test":3:{s:4:"name";s:2:"lu";s:11:"testname2";s:2:"lu";s:8:"*name3";s:2:"lu";}
注意:序列化對象時,不會保存常量的值。對於父類中的變量,則會保留。
序列化只序列化屬性,不序列化方法。
簡單介紹下具體含義

但是我們注意到上面的例子序列化的結果有些不對。那是因為序列化public private protect參數會產生不同結果,test類定義了三個不同類型(私有,公有,保護)但是值相同的字符串但是序列化輸出的值不相同。
通過對網頁抓取輸出是這樣的
`O:4:"test":3:{s:4:"name";s:2:"lu";s:11:"