0 x00序列化
所有php里面的值都可以使用函数序列化()来返回一个包含字节流的字符串来表示.unserialize()函数能够重新把字符串变回php原来的值。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。所有php里面的值都可以使用函数
序列化()
来返回一个包含字节流的字符串来表示。
unserialize ()
函数能够重新把字符串变回php原来的值。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
& lt; !——更多的在
序列化的例子
<代码类="语言"> & lt; php ?/* * * * @authors犹豫(daikersec@gmail.com) * @date 2017-12-22 15:39:43 $ * @version $ Id */error_reporting (E_ALL); var_int=1美元; 美元var_str=" 123 "; var_float=1.2美元; 美元var_bool=true; $ var_arr=阵列(' 1 '=比;1、1.2、假); 类名称{ var var_name=1美元; 函数myfunction () { 返回“1”; } } $ arrayName=阵列($ var_int var_str美元var_float美元,美元var_bool, var_arr美元,新类名()); foreach (arrayName美元美元关键=比;美元值){ 回声序列化(价值美元)。“& lt; br/祝辞”; } 代码>
结果是
<代码类="语言"> i: 1; s: 3:“123”; d: 1.2; b: 1; 3:{我:1;我:1,:2,d: 1.2;我:3;b: 0;} O: 9:“类名”:1:{:8:“var_name”;我:1;}代码>
从例子中我们可以看的到,变量,数组,对象可以被序列化。变量的值会被保存下来。以<代码>:代码>隔开,类名会被保存下来,类变量,类变量名和类变量值会被保存下来,类方法不会被保存起来。
0 x01反序列化
反序列化就是将序列化后的字符串转化回数组和对象
看例子
<代码类="语言"> & lt; php ?/* * * * @authors犹豫(daikersec@gmail.com) * @date 2017-12-22 16:02:17 $ * @version $ Id */un_arr_str美元=' 3:{我:1;我:1,:2,d: 1.2;我:3;b: 0;}”;//$ var_arr=阵列(' 1 '=比;1、1.2、假); 美元un_class_str=' O: 9:“名称”:1:{:8:“var_name”;我:1;}'; var_dump (unserialize (un_arr_str美元)); (O=unserialize美元un_class_str);//var_dump (O); var_dump (O→美元var_name); 代码>
这里的结果是
<代码类="语言">数组(3){[1]=比;int(1)[2]=比;浮动(1.2)[3]=比;bool (false)} 零代码> >之前比较奇怪的是为什么第二个会是NULL。因为将对象序列化之后,只是保存它的关键数据,对于这个类的具体内容一无所知,所以反序列回一个对象的时候,需要反序列的上下文中存在模板(这里就是类的定义)。
0 x02魔术函数
PHP将所有以__(两个下划线)开头的类方法保留为魔术方法。
下面举一个例子。<代码类="语言">类名称{ 函数__construct () { 回声“你好,我是__construct”; } } 新类名();代码>这里的输出结果是
<代码类="语言">你好,我__construct 代码>其实这里的一个对象实例化的过程中默认会调用的__construct ()。
php常用的魔术函数有<代码类="语言"> __construct (), __destruct (), __call (), __callStatic (), __get (), __set (), __isset (), __unset (), __sleep (), __wakeup (), __toString (), __invoke (), __set_state (), __clone()和__debugInfo() 代码>这里们并非每个都会在这里面用的到,下面用一个例子来说下看几个常用到的魔术函数。
<代码类="语言"> & lt; php ?/* * * * @authors犹豫(daikersec@gmail.com) * @date 2017-12-22 16:24:32 $ * @version $ Id */类名称{ 私人$ name=" 123 "; 函数__construct () { 回声“你好,我是__construct”。“& lt; br/祝辞”; } 函数__destruct () { 回声“你好,我是__destruct”。“& lt; br/祝辞”; } 函数__wakeup () { 回声“你好,我是__wakeup”。“& lt; br/祝辞”; } 函数__sleep () { 回声“你好,我是__sleep”。“& lt; br/祝辞”; 返回数组($ this→名称); } 函数__get(美元的名字){ 回声“你好,我是__get”。“& lt; br/祝辞”; 返回$ this→名称; } 函数__toString () { 回声“你好,我是__toString”。“& lt; br/祝辞”; 返回“你好”; } } O=美元新类名(); $ s=序列化(O); echo $ s。“& lt; br/祝辞”; O=美元unserialize ($ s); o .美元“& lt; br/祝辞”; O→美元;php反序列化漏洞