序列化与反序列化
序列化和反序列化可以看成格式的转换(如果不是深入学习,只是想利用序列化的话)
序列化后的数据类似下面这种
序列化结果:
O:4:"User":1:{s:4:"name";s:3:"Bob";}
反序列化则是
反序列化后的对象属性:
Name: Bob
而php的序列化和两个函数有关 ,序列化是serialize()函数,反序列化是unserialize()函数,当你拿到一段php代码发现有这两个函数,则说明可能存在序列化问题。
序列化和反序列化用来干嘛
序列化和反序化通常是对一些参数的验证,也就是当你访问一些页面需要参数认证时,如果存在序列化和反序列化的话,你输入的参数尽管值是对的,但是不符合格式的问题。
如何利用
把源代码里面关于序列化的内容和变量拿出来跑一下然后再传参访问就可以了(为什么知道是序列化了还是要用他的源码,因为一不注意你的结果和他的结果存在格式差别,也就是内容不一样,所以取出来会避免一些问题)
类和魔术方法
下面的代码就涉及到有类和魔术方法的序列化和反序列化
<?php
class User {
public $name;
private $password;
public function __construct($name, $password) {
$this->name = $name;
$this->password = $password;
}
// 序列化时自动调用(控制要序列化的属性)
public function __sleep() {
return ['name']; // 仅序列化 name,排除 password
}
// 反序列化时自动调用
public function __wakeup() {
$this->password = 'default_reset'; // 重置密码
}
}
// 创建对象
$user = new User('Bob', 'secret123');
// 序列化对象
$serialized = serialize($user);
echo "序列化结果:\n" . $serialized . "\n";
// 反序列化还原对象
$unserialized = unserialize($serialized);
echo "\n反序列化后的对象属性:\n";
echo "Name: " . $unserialized->name . "\n";
// echo "Password: " . $unserialized->password; // 无法访问 private 属性
?>
类就是指定义了一个class
魔术方法就是一些特定触发的函数
之所以有区别就是当存在魔术方法时就不再是简单的传参数就能得到结果而是需要满足特定的函数触发条件,你的参数的数量和内容就都需要调整 。当你遇到这种问题时,去查一下特定魔术方法的触发条件就可以了