php使用serialize()這個過程被稱為序列化,使用unserialize()這個過程被稱作反序列化。用於序列化物件或陣列,並返回乙個字串。序列化會儲存物件中的所有變數,不會儲存物件的方法,只會儲存類的名字。php序列化就是將記憶體的變數資料「儲存」到檔案的持久資料的過程例子:
<?php
class
user
}//建立乙個物件
$user
=new
user()
;$user
->
name
='iring'
;$user
->
age=18;
//輸出資料
$user
->
printdata()
;echo
"\n"
;//輸出序列化後的資料
可以發現對於物件,序列化後的格式為:
o:strlen(類名):類名:類的變數個數:
注:物件中的常量在序列化後是不會保留的。如果存在類的繼承,會保留父類中的變數
其他型別的資料序列化後的格式為:
string型別 :s:size:value;
integer型別 :i:value;
boolean型別 :b:value;
(儲存1或0)
null型 :n;
array :a:size:
函式用於將通過serialize()函式序列化後的物件或者陣列進行反序列化,並返回原始物件的結構。可以將反序列化理解為就是:將檔案中的持久資料轉變成記憶體中的變數資料
//輸出序列化後的資料
$temp
=serialize
($user);
echo
$temp
."\n"
;//反序列化
需要了解php的「魔法函式」:以__(兩個下劃線)開頭的類方法被保留為魔法方法。這些方法會在特定的時候被呼叫。例子
__construct() 當乙個物件被建立時候被呼叫(構造方法)
__destruct() 當乙個物件被銷毀的時候呼叫(析構方法)
__tostring() 當乙個物件被當做字串時被呼叫
__wakeup() 當使用unserialize時候觸發
__sleep() 當使用serialize時候觸發
物件注入因為php允許物件序列化,因此使用者可以提交序列化的字串,若沒有對請求進行嚴格的過濾,在傳遞給unserialize()函式後就可能造成php物件注入漏洞。
物件漏洞需要滿足的前提:
例子:
<?php
error_reporting(0
);class
test}$a
=$_post
['test'];
//post方法獲得前端資料
print_r($a
);$b=
unserialize($a
);//對傳入的字串反序列化
程式結束時會銷毀變數,會觸發__destruct()函式,我們可以通過反序列化構造出變數的值,使得其中的內容被當做**去執行。構造乙個payload測試一下:
繞過魔法函式的反序列化
wakeup()魔法函式繞過
php5<5.6.25
php7<7.0.10
當在反序列化字串中,表示屬性個數的值大於真實屬性個數時,會繞過__wakeup()函式的執行
php序列化和反序列化
把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 1.建立乙個 arr陣列用於儲存使用者基本資訊,並在瀏覽器中輸出檢視結果 arr array arr name 張三 arr age 22 arr 男 arr phone 12...
php序列化和反序列化
序列化與反序列化 把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 1.建立乙個 arr陣列用於儲存使用者基本資訊,並在瀏覽器中輸出檢視結果 arr array arr name 張三 arr age 22 arr 男 arr...
序列化和反序列化 C 序列化與反序列化。
序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...