序列化
将变量或对象转换成字符串的过程。
1 | $my = serialize($Site); |
反序列化
1 | unserialize(string $my) |
如果传入的字符串不可被反序列化,则会返回FALSE
,并产生一个 E_NOTICE
。
魔术函数:
_construct():创建对象时初始化
_destruction():结束时销毁对象
_toString():对象被当作字符串时使用
_sleep():序列化对象之前调用
_wakeup():反序列化之前调用
_call():调用对象不存在时使用
_get():调用私有属性时使用
_set(): 给私有属性赋值时使用
_invoke():当尝试以调用函数的方式调用一个对象时使用(5.3.0)
如果类中同时定义了 __unserialize() 和 __wakeup() 两个魔术方法,则只有 __unserialize() 方法会生效,__wakeup() 方法会被忽略。(7.4.0)
CVE-2016-7124漏洞
当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup
的执行
防范方法
严格控制unserialize
函数的参数,坚持用户所输入的信息都是不可靠的原则。
对于unserialize
后的变量内容进行检查,以确定内容没有被污染。
参考
Author: suyumen
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.