PHP--序列化與反序列化詳解
博客說明
文章所涉及的資料來自互聯(lián)網(wǎng)整理和個人總結(jié),意在于個人學習和經(jīng)驗匯總,如有什么地方侵權,請聯(lián)系本人刪除,謝謝!
說明
學到網(wǎng)絡安全的時候用到了序列化和反序列化的操作,感覺挺有用的,首先給出文檔地址https://www.php.net/manual/zh/language.oop5.serialization.php
所有php里面的值都可以使用函數(shù)serialize()來返回一個包含字節(jié)流的字符串來表示。unserialize()函數(shù)能夠重新把字符串變回php原來的值。 序列化一個對象將會保存對象的所有變量,但是不會保存對象的方法,只會保存類的名字。
為了能夠unserialize()一個對象,這個對象的類必須已經(jīng)定義過。如果序列化類A的一個對象,將會返回一個跟類A相關,而且包含了對象所有變量值的字符串。 如果要想在另外一個文件中解序列化一個對象,這個對象的類必須在解序列化之前定義,可以通過包含一個定義該類的文件或使用函數(shù)spl_autoload_register()來實現(xiàn)。
PHP序列化:serialize
序列化是將變量或?qū)ο筠D(zhuǎn)換成字符串的過程。
<?php
class student{
public $name;
public $age;
public $number;
//_construct:創(chuàng)建對象時初始化
function __construct($name,$age,$number){
$this->name = $name;
$this->age = $age;
$this->number = $number;
}
}
$student = new student("Jack",22,11086);
var_dump(serialize($student));
?>
測試運行

image-20200503100649029
string(76) "O:7:"student":3:{s:4:"name";s:4:"Jack";s:3:"age";i:22;s:6:"number";i:11086;}"
PHP反序列化:unserialize
反序列化是將字符串轉(zhuǎn)換成變量或?qū)ο蟮倪^程。
<?php
class student{
public $name;
public $age;
public $number;
//_construct:創(chuàng)建對象時初始化
function __construct($name,$age,$number){
$this->name = $name;
$this->age = $age;
$this->number = $number;
}
}
$student = 'O:7:"student":3:{s:4:"name";s:4:"Jack";s:3:"age";i:22;s:6:"number";i:11086;}';
var_dump(unserialize($student));
?>
測試運行

image-20200503101454170
object(student)#1 (3) {
["name"]=>
string(4) "Jack"
["age"]=>
int(22)
["number"]=>
int(11086)
}
魔術函數(shù)
| 函數(shù) | 說明 |
|---|---|
| __construct() | 類的構造函數(shù) |
| __destruct() | 類的析構函數(shù) |
| __call() | 在對象中調(diào)用一個不可訪問方法時調(diào)用 |
| __callStatic() | 用靜態(tài)方式中調(diào)用一個不可訪問方法時調(diào)用 |
| __get() | 獲得一個類的成員變量時調(diào)用 |
| __set() | 設置一個類的成員變量時調(diào)用 |
| __isset() | 當對不可訪問屬性調(diào)用isset()或empty()時調(diào)用 |
| __unset() | 當對不可訪問屬性調(diào)用unset()時被調(diào)用 |
| __sleep() | 執(zhí)行serialize()時,先會調(diào)用這個函數(shù) |
| __wakeup() | 執(zhí)行unserialize()時,先會調(diào)用這個函數(shù) |
| __toString() | 類被當成字符串時的回應方法 |
| __invoke() | 調(diào)用函數(shù)的方式調(diào)用一個對象時的回應方法 |
| __set_state() | 調(diào)用var_export()導出類時,此靜態(tài)方法會被調(diào)用 |
| __clone | 當對象復制完成時調(diào)用 |
| __autoload() | 嘗試加載未定義的類 |
| __debugInfo() | 打印所需調(diào)試信息 |
為什么突然說到魔術函數(shù)呢,因為在序列化和反序列化的時候經(jīng)常會用到__construct(),__destruct(),__sleep(),__wakeup()
在后面的博客里面有相應的ctf實例
感謝
萬能的網(wǎng)絡
以及勤勞的自己