[极客大挑战 2019]PHP 1 解题思路
[极客大挑战 2019]PHP
1
1 基础知识
什么是php序列化
例子
<?php $username = array("tan","ji"); $username = serialize($username); echo ($username. "\n"); print_r(unserialize($username)); var_dump(unserialize($username));
输出的内容为
a:2:{i:0;s:3:"tan";i:1;s:2:"ji";} ----- echo ($username. "\n"); Array -------------------------------- print_r(unserialize($username)); ( [0] => tan [1] => ji ) array(2) { ---------------------------- var_dump(unserialize($username)); [0]=> string(3) "tan" [1]=> string(2) "ji" }
在 PHP 的序列化中,魔术方法(Magic Methods)是一组特殊的方法,这些方法以双下划线(
__
)作为前缀,可以在特定的序列化阶段触发从而使开发者能够进一步的控制 序列化 / 反序列化 的过程。你可以在 PHP 官方文档中查找到对应魔术方法的定义和使用方法:PHP: 魔术方法 - Manual
一般在题目中常见的几个方法如下:
__wakeup() //------ 执行unserialize()时,先会调用这个函数 __sleep() //------- 执行serialize()时,先会调用这个函数 __destruct() //---- 对象被销毁时触发 __call() //-------- 在对象上下文中调用不可访问的方法时触发 __callStatic() //-- 在静态上下文中调用不可访问的方法时触发 __get() //--------- 用于从不可访问的属性读取数据或者不存在这个键都会调用此法 __set() //--------- 用于将数据写入不可访问的属性 __isset() //------- 在不可访问的属性上调用isset()或empty()触发 __unset() //------- 在不可访问的属性上使用unset()时触发 __toString() //---- 把类当作字符串使用时触发 __invoke() //------ 当尝试将对象调用为函数时触发
暂无评论
发表评论