[极客大挑战 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" }

image-20230511213751065image-20230511220616100

在 PHP 的序列化中,魔术方法(Magic Methods)是一组特殊的方法,这些方法以双下划线(__)作为前缀,可以在特定的序列化阶段触发从而使开发者能够进一步的控制 序列化 / 反序列化 的过程。

你可以在 PHP 官方文档中查找到对应魔术方法的定义和使用方法:PHP: 魔术方法 - Manual

一般在题目中常见的几个方法如下:

__wakeup() //------ 执行unserialize()时,先会调用这个函数  __sleep() //------- 执行serialize()时,先会调用这个函数  __destruct() //---- 对象被销毁时触发  __call() //-------- 在对象上下文中调用不可访问的方法时触发  __callStatic() //-- 在静态上下文中调用不可访问的方法时触发  __get() //--------- 用于从不可访问的属性读取数据或者不存在这个键都会调用此法  __set() //--------- 用于将数据写入不可访问的属性  __isset() //------- 在不可访问的属性上调用isset()或empty()触发  __unset() //------- 在不可访问的属性上使用unset()时触发  __toString() //---- 把类当作字符串使用时触发  __invoke() //------ 当尝试将对象调用为函数时触发