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:"