PHP--序列化與反序列化詳解

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)絡

以及勤勞的自己

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容