PHP反序列化

魔术方法

一个预定义好的,在特定情况下自动触发的行为方法。

反序列化过程中,unserialize()接受的值(字符串)可控;通过更改这个值(字符串),得到所需要的代码;通过调用魔术方法,触发代码的执行。

1.__construct()

构造函数,在实例化一个对象的时候,首先会去自动执行的一个方法。

在实例化时触发它。

2.__destruct()

析构函数,在对象的所有引用被删除或者当对象被显示销毁时执行的魔术方法。

实例化对象结束后,代码运行完全销毁会触发。

在序列化过程中不会触发。

在反序列化过程中触发,反序列化得到的对象,用完后会销毁,触发它。

3.__sleep()

序列化之前会触发。

此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。

如果该方法未返回任何内容,则NULL被序列化,并产生一个E_NOTICE级别的错误。

它需要参数,参数为成员属性。

最后会返回需要被序列化存储的成员属性。

4.__wakeup()

反序列化之前会触发。

反序列化之前会检查是否存在这个魔术方法,如果存在,则会先调用,预先准备对象需要的资源,返回void。

常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。

5.__toString()

把对象当成字符串调用时,会触发。

例如我们去echo字符串时,echo ‘string’,如果里面是个对象就会触发这个魔术方法。

调用对象可以使用print_r或者var_dump。

echo和print会导致对象被当作为字符串使用。

6.__invoke()

把对象当成函数调用。

例如有一个 function abc(){} 和一个对象 $test

我们 abc(); 会调用这个函数,同理如果我们去写成 $test(); 就相当于把对象当做函数来用,就会触发这个魔术方法。