php反序列化
php定义属性类型
修饰符 | 序列化结果 | 当前类内部 | 子类内部 | 外部对象(实例化调用) | 权限等级 |
|---|
private
| 纯属性名 | ✅ | ❌ | ❌ | 最小(私有) |
protected
| \0*\0属性名 | ✅ | ✅ | ❌ | 中等(受保护) |
public
| \0类名\0属性名 | ✅ | ✅ | ✅ | 最大(公共) |
php反序列化函数
unserialize #反序列化
serialize #序列化
#构造反序列化时使用url编码(不可见字符 '\0' '*')
#php7.1+版本,反序列化对属性类型不敏感;
#反序列化赋值三种方法(绕过'\0'字符过滤): 外部赋值 构造方法赋值 直接赋值
魔术方法 | 触发条件 |
|---|
__construct()
| 对象创建(new)时会自动调用 |
__wakeup()
| 使用 unserialize() 时触发 |
__sleep()
| 使用 serialize() 时触发 |
__destruct()
| 对象被销毁时触发 |
__call()
| 在对象上下文中调用不可访问的方法时触发 |
__callStatic()
| 在静态上下文中调用不可访问的方法时触发 |
__get()
| 用于从不可访问的属性读取数据 |
__set()
| 用于将数据写入不可访问的属性 |
__isset()
| 在不可访问的属性上调用 isset() 或 empty() 时触发 |
__unset()
| 在不可访问的属性上使用 unset() 时触发 |
__toString()
| 把类当作字符串使用时触发 |
__invoke()
| 当脚本尝试将对象调用为函数时触发 |
__autoload()
| 在代码中调用不存在的类时会自动调用该方法 |
session.serialize_handler处理器
处理器 | 对应储存格式 |
|---|
php | 键名 + 竖线 + 经过 serialize() 函数反序列处理的值 |
php_binary | 键名的长度对应的 ASCII 字符 + 键名 + 经过 serialize() 函数反序列处理的值 |
php_serialize (php>=5.5.4) | 经过 serialize() 函数反序列处理的数组 |
数组的特性
当一个数组被挡函数触发时,数组第一个元素是对象,第二个元素是方法的名字时,对调用对象的方法。