详解php反序列化
副问题[/!--empirenews.page--]
最近也是在温习之前学过的内容,感受对PHP反序列化的领略越发深了,以是在此总结一下 2 serialize()函数 “全部php内里的值都可以行使函数serialize()来返回一个包括字节约的字符串来暗示。序列化一个工具将会生涯工具的全部变量,可是不会生涯工具的要领,只会生涯类的名字。” 一开始看这个观念也许有些懵,但之后也是逐步领略了 在措施执行竣事时,内存数据便会当即烧毁,变量所储存的数据即是内存数据,而文件、数据库是“耐久数据”,因此PHP序列化就是将内存的变量数据“生涯”到文件中的耐久数据的进程。 $s = serialize($变量); //该函数将变量数据举办序列化转换为字符串 file_put_contents(‘./方针文本文件', $s); //将$s生涯到指定文件 下面通过一个详细的例子来相识一下序列化: <?php class User { public $age = 0; public $name = ''; public function PrintData() { echo 'User '.$this->name.'is'.$this->age.'years old. <br />'; } } //建设一个工具 $user = new User(); // 配置数据 $user->age = 20; $user->name = 'daye'; //输出数据 $user->PrintData(); //输出序列化之后的数据 echo serialize($user); ?> 这个是功效: 可以看到序列化一个工具后将会生涯工具的全部变量,而且发明序列化后的功效都有一个字符,这些字符都是以下字母的缩写。 a - array b - boolean d - double i - integer o - common object r - reference s - string C - custom object O - class N - null R - pointer reference U - unicode string 相识了缩写的范例字母,便可以获得PHP序列化名目 O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"daye";} 工具范例:长度:"类名":类中变量的个数:{范例:长度:"值";范例:长度:"值";......} 通过以上例子,便可以领略了观念中的通过serialize()函数返回一个包括字节约的字符串这一段话。 3 unserialize()函数 unserialize() 对单一的已序列化的变量举办操纵,将其转换回 PHP 的值。在解序列化一个工具前,这个工具的类必需在解序列化之前界说。 简朴来领略起来就算将序列化过存储到文件中的数据,规复到措施代码的变量暗示情势的进程,规复到变量序列化之前的功效。 $s = file_get_contents(‘./方针文本文件'); //取得文本文件的内容(之前序列化过的字符串) $变量 = unserialize($s); //将该文本内容,反序列化到指定的变量中 通过一个例子来相识反序列化: <?php class User { public $age = 0; public $name = ''; public function PrintData() { echo 'User '.$this->name.' is '.$this->age.' years old. <br />'; } } //重建工具 $user = unserialize('O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"daye";}'); $user->PrintData(); ?> 这个是功效: 留意:在解序列化一个工具前,这个工具的类必需在解序列化之前界说。不然会报错 4 PHP反序列化裂痕 在进修裂痕前,先来相识一下PHP邪术函数,对接下来的进修会很有辅佐 PHP 将全部以 __(两个下划线)开头的类要领保存为把戏要领 __construct 当一个工具建设时被挪用, __destruct 当一个工具烧毁时被挪用, __toString 当一个工具被看成一个字符串被挪用。 __wakeup() 行使unserialize时触发 __sleep() 行使serialize时触发 __destruct() 工具被烧毁时触发 __call() 在工具上下文中挪用不行会见的要领时触发 __callStatic() 在静态上下文中挪用不行会见的要领时触发 __get() 用于从不行会见的属性读取数据 __set() 用于将数据写入不行会见的属性 __isset() 在不行会见的属性上挪用isset()或empty()触发 __unset() 在不行会见的属性上行使unset()时触发 __toString() 把类看成字符串行使时触发,返回值必要为字符串 __invoke() 当剧本实行将工具挪用为函数时触发 这里只列出了一部门的邪术函数,详细可见 https://www.php.net/manual/zh/language.oop5.magic.php 下面通过一个例子来相识一下邪术函数被自动挪用的进程 <?php class test{ public $varr1="abc"; public $varr2="123"; public function echoP(){ echo $this->varr1."<br>"; } public function __construct(){ echo "__construct<br>"; } public function __destruct(){ echo "__destruct<br>"; } public function __toString(){ return "__toString<br>"; } public function __sleep(){ echo "__sleep<br>"; return array('varr1','varr2'); } public function __wakeup(){ echo "__wakeup<br>"; } } $obj = new test(); //实例化工具,挪用__construct()要领,输出__construct $obj->echoP(); //挪用echoP()要领,输出"abc" echo $obj; //obj工具被当做字符串输出,挪用__toString()要领,输出__toString $s =serialize($obj); //obj工具被序列化,挪用__sleep()要领,输出__sleep echo unserialize($s); //$s起首会被反序列化,会挪用__wake()要领,被反序列化出来的工具又被当做字符串,就会挪用_toString()要领。 // 剧本竣事又会挪用__destruct()要领,输出__destruct ?> 这个是功效: 通过这个例子就可以清楚的看到邪术函数在切合响应的前提时便会被挪用。 5 工具注入 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |