PHP的序列化和反序列化

2021-10-23 03:22:47 字數 2409 閱讀 8086

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...