序列化和反序列化
序列化与反序列化
序列化
将对象的状态信息转换为可以存储或传输形式的过程(字符串)。在序列化期间,对象将其当前的状态写入到临时(内存)或持久性存储区(硬盘)。以后可以通过从存储区中读取或者反序列化对象状态,重新创建状态。
简单来讲,序列化就是把一个对象变成可传输的字符串,可以以特定的格式在进程之间跨平台、安全的进行通信。字符串包括,属性名,属性值,属性类型和该对象对应的类名。
对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。讲用户存储到临时或硬盘中(数据库),可以理解为一个拍快照,通常使用非关系型Redis、MongoDB等(非关系型数据库一般用来进行缓存数据)
常见的序列化格式
二进制格式
字节数组
json字符串
xml字符串
序列化的目的是方便数据的传输和存储。
PHP中序列化一般有以下几种,使用serialize()方法:
字符串序列化
eg:
输出结果:序列化:s:4:"test";
数组对象序列化
eg:
输出结果 a:2:{s:4:"name";s:4:"jack";s:3:"age";i:13;}
类对象序列化
eg:
输出结果 O:4:"test":1:{s:1:"a";s:4:"test";}
序列化字符含义
a-array 数组
b-boolean 布尔型
d-double 双精度型
i-integer 整型
o-common object 一般对象
r-reference
s-string 字符串
C-custom object 自定义对象
O-class N -null 表示类
R-pointer reference
U-unicode string unicode 编码的字符串
反序列化
就是序列化过程的逆向操作而已,也就是字符串转换为对象的过程。
在PHP中,使用unserialize()方法进行反序列化。
eg:
'; print_r(unserialize($str));//反序列化 ?>PHP反序列化漏洞
也叫PHP对象注入,是一个非常常见的漏洞。漏洞形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,从而造成代码执行、getshell等一系列不可控的后果。反序列化不是PHP的持有,也存在于Java、Python等语言中。
PHP中的magic方法(函数):
魔法方法就是在某些条件下自动执行的函数。
PHP类可能会包含一些特殊的函数叫magic方法,magic方法命名是以符号_开头的,比如_construct()、_destruct()、_toString()、_sleep()、_wakeup()等等,这些函数在某些情况下会自动调用。
_construct():构造函数,当对象创建(new)时会自动调用。unserialize()反序列化是不会自动调用的。
_destruct():析构函数,当对象被销毁时会自动调用。
_wakeup():unserialize()时会检查是否存在_wakeup(),如果存在,则会优先调用_wakeup()方法。
_toString():用于处理一个类被当成字符串时字符串应怎样回应,因此当一个对象被当作一个字符串时就会调用。
_sleep():用于提交未提交的数据,或类似的清理操作,因此当一个对象被序列化的时候被调用。
————————————————
版权声明:本文为CSDN博主「xiao9105」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_47599604/article/details/115418557

浙公网安备 33010602011771号