php反序列化
面向对象编程(OOP)
它是一种编程范式,使用"对象"的概念来组织和数据。在PHP中,OOP提供了一种更结构化、模块化的方式来开发应用程序。
OOP的基本特征
-
封装(Encapsulation)
将数据和操作数据的方法绑定在一起
通过访问修饰符(public, protected, private)控制可见性
-
继承(Inheritance)
子类可以继承父类的属性和方法
实现代码复用和层次关系 -
多态(Polymorphism)
同一操作作用于不同类的实例会产生不同行为
通过接口和抽象类实现 -
抽象(Abstraction)
提取关键特征而忽略非必要细节
通过抽象类和接口实现
OOP的重要组成部分
-
类(Class)
对象的蓝图或模板:
class Animal { /* ... */ } -
对象(Object)
类的具体实例:
"new"关键字用于创建对象
$dog = new Animal();//$dog是Animal类的一个对象 -
属性(Property)
类/对象的特征或数据(也称为成员变量):
public $name; private $age;-
public修饰的属性可以从类外部直接访问
-
private修饰的属性只能在类内部访问
-
-
方法(Method)
类/对象的行为或功能(也称为成员函数):
用于定义对象能执行的操作
public function eat() { /* ... */ }
OOP实例
class Animal {
// 属性
public $name;
public $type;
// 构造函数
public function __construct($name, $type) {
$this->name = $name;
$this->type = $type;
}
// 方法
public function makeSound() {
echo "This animal makes a sound.";
}
}
// 创建对象
$dog = new Animal("Buddy", "Dog");
$cat = new Animal("Whiskers", "Cat");
// 调用对象的方法
$dog->makeSound(); // 输出: This animal makes a sound.
$cat->makeSound(); // 输出: This animal makes a sound.
class User{ //定义了名为User的类
//属性
protected $name;
//方法
public function say(){
return $this->name .'说,你好';
}
//方法
public function setName(string $name){
$this->name = $name;
}
}
//创建对象
$obj = new User;
//调用对象的方法
$obj->setName('zzz'); //输出:zzz
echo $obj->say(); //输出:说,你好
序列化与反序列化
在PHP中,序列化和反序列化是以一种将变量(如数组或对象)转换成可以存储或传输的字符串格式的方法,再将这些字符串还原为原始的变量。一般用于处理数据持久化、会话存储或跨脚本通信。
变量与数据结构
变量:所有数据的存储单元都以变量的形式存在
数据结构:是指组织和存储数据的方式
在PHP中,变量和数据等结构,构成了程序数据存储和处理的基础体系。它们之间存在着层级递进的关系:
变量 → [基本数据类型] → [复合数据类型] → [高级数据结构]
(标量类型) (数组/对象) (Spl数据结构/自定义结构)
PHP序列化
序列化是将PHP的数据结构(如数组或对象),转化成一个串行的字节流(即字符串),从而保存到文件或数据库中,以及实现网络传输。
通过serialize()函数来执行序列化:
// 序列化
$data = ['name' => 'John', 'age' => 30, 'is_admin' => false];
$serialized = serialize($data);
echo $serialized;
// 输出类似:
//a:3:{s:4:"name";s:4:"John";s:3:"age";i:30;s:7:"is_admin";b:0;}
- a:表示array(数组)
- 3:数组有三个元素
- s:string(字符串)
- i:integer(整数索引)
- b:布尔值(1为true)
- 4/7:字符串长度

PHP反序列化
PHP反序列化主要用于数据恢复、网络通信(在网络上传输的对象或数组数据,通过序列化转换为字符串后存储或传输,接收端需要通过反序列化将其恢复为原始格式)、会话管理及数据持久化等场景,通常用unserialize()函数来执行。
PHP反序列化漏洞
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。
在反序列化的过程中自动触发了某些魔术方法。
漏洞触发条件: unserialize()函数的参数、变量可控,php文件中存在可利用的类,类中有魔术方法
浙公网安备 33010602011771号