在 PHP 中,serialize
和 unserialize
是两个用于处理数据的函数,主要用于将 PHP 的数据类型(如数组和对象)转换为字符串格式,以及将字符串格式的数据转换回 PHP 的数据类型。
(可以想象网购的场景,serialize就是商家包装商品,unserialize就是你拆快递,还原商品)
先粗略了解一下serialize
serialize()
serialize()
函数将一个 PHP 值转换为一个可存储或传输的字符串。这个字符串可以被 unserialize()
函数恢复为原来的 PHP 值。常用于将复杂数据(如数组或对象)存储到数据库或文件中,或在会话中保存状态。
<?php
$data = [
'name' => 'Alice',
'age' => 25,
'is_student' => false
];
// 序列化数组
$serialized_data = serialize($data);
echo "Serialized Data: " . $serialized_data . "\n";
?>
$data 是要被序列化的PHP值(可以是数组,对象,字符串等)
//输出:
Serialized Data: a:3:{s:4:"name";s:5:"Alice";s:3:"age";i:25;s:10:"is_student";b:0;}
unserialize()
unserialize()
函数将一个经过 serialize()
处理的字符串转换回原来的 PHP 值(数组或对象)。
mixed unserialize(string $str);
- 参数:
$str
是要被反序列化的字符串,它必须是通过serialize()
生成的。 - 返回值:返回原来的 PHP 值(如数组、对象等),如果字符串无效,则返回
false
。
示例
<?php
$serialized_data = 'a:3:{s:4:"name";s:5:"Alice";s:3:"age";i:25;s:10:"is_student";b:0;}';
// 反序列化字符串
$data = unserialize($serialized_data);
print_r($data);
?>
//输出:
Array
(
[name] => Alice
[age] => 25
[is_student] =>
)
unserialize()
函数用于将序列化字符串转换回 PHP 值(通常是对象、数组等)。在这个过程中,魔术方法 __wakeup()
会被调用。其作用是允许开发者在对象没有被完全构造时进行一些设置或恢复操作。
常见的魔法函数
-
__construct()
:构造方法,在对象实例化时调用,用于初始化对象属性public function __construct($param) { // 初始化代码 }
-
__destruct()
:析构方法,在对象销毁时调用,通常用于释放资源。public function __destruct() { // 清理代码 }
-
__call($name, $arguments)
:当调用未定义或不可访问的方法时调用。public function __call($name, $arguments) { // 处理未定义方法的逻辑 }
-
__get($name)
:当试图访问未定义或不可访问的属性时调用。public function __get($name) { // 返回属性值 }
-
__set($name, $value)
:当试图设置未定义或不可访问的属性时调用。public function __set($name, $value) { // 设置属性值 }
-
__isset($name)
:当调用isset()
或empty()
函数检查未定义或不可访问的属性时调用。public function __isset($name) { // 返回属性是否存在 }
-
__unset($name)
:当调用unset()
函数试图删除未定义或不可访问的属性时调用。public function __unset($name) { // 处理删除属性的逻辑 }
-
__toString()
:当试图将对象当做字符串使用时调用,通常用于定义对象的字符串表示。public function __toString() { return "字符串表示"; }
-
__invoke()
:允许对象被当作函数调用。public function __invoke($arg) { // 处理函数调用 }
-
__sleep()
和__wakeup()
:用于序列化和反序列化对象。__sleep()
在对象序列化时调用,用于返回要序列化的属性名。__wakeup()
在对象反序列化时调用,用于执行重新初始化操作。
想深入了解序列化和反序列化的可以看这些大佬写的博客:
unserialize()实例
以攻防世界这道题为例:unserialize3
补充完整(个人用的是vscode)
然后保存,在浏览器打开(我是将该文件移到phpstudy的WWW目录下再在浏览器打开,phpstudy下载可以看这位博主的PhpStudy下载安装使用教程,图文教程(超详细))
O代表object(为A时代表Array),4代表"xctf"占4个字符长度,1代表着对象具有一个个变量,(此处有两个:flag和111,所以在URL中要进行改动),s代表string,字符型(如果为i,代表int型)
为了绕开__wakeup,将“1”改为“3”或者更大的数字(当序列化字符串表示对象属性个数的值大于真实个数的属性就会跳过wakeup)
欢迎评论区纠正与补充