PHP反序列化漏洞
一、序列化和反序列化是什么
- 序列化
序列化是把内存中的数据结构(如对象、列表等)转化为可存储或可传输格式(如 JSON、XML、二进制数据)的过程,这样就能将数据保存到文件或通过网络发送出去。 - 反序列化
反序列化则是序列化的逆向操作,它把之前序列化得到的存储或传输格式的数据重新转换为内存中的数据结构,以便程序能继续对其进行处理和使用。
二、为什么需要序列化
- 数据持久化:将内存中的对象转为文件可存格式,如 JSON、XML,便于存储到磁盘,后续可反序列化读取。
- 网络传输:网络传输仅支持二进制数据,序列化后的数据能在不同计算机间交换,接收方再反序列化处理。
三、魔术方法
什么是魔术方法
魔术方法就是编程语言中的一些特殊方法,这些方法在某些特定的条件会自动执行
常见的魔术方法
- __call:调用不可访问或者不存在的方法时被调用。
- __callStatic:调用不可访问或者不存在的静态方法时被调用。
- __clone:对对象进行clone时,被调用。
- __constuct:创建对象时,被调用。
- __debuginfor:当调用var_dump()打印对象时被调用
- destruct:摧毁对象时,被调用。
- __get:读取不可访问或不存在属性时被调用
- __invoke:当以函数方式调用对象时被调用
- __isset:对不可访问或不存在的属性调用isset0或empty0时被调用
- __set:当给不可访问或不存在属性赋值时被调用
- __set_state:当调用var_export0导出类时,此静态方法被调用。用 set state的返回值做为var_export的返回值
- __sleep:当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用
- __tosleep:当一个类被转换成字符串时被调用
- __unset:对不可访问或不存在的属性进行unset时被调用
- __wakeup:当使用unserialize时被调用,可用于做些对象的初始化操作