php反序列化

面向对象编程(OOP)

它是一种编程范式,使用"对象"的概念来组织和数据。在PHP中,OOP提供了一种更结构化、模块化的方式来开发应用程序。

OOP的基本特征

  1. 封装(Encapsulation)

    将数据和操作数据的方法绑定在一起

    通过访问修饰符(public, protected, private)控制可见性

  2. 继承(Inheritance)
    子类可以继承父类的属性和方法
    实现代码复用和层次关系

  3. 多态(Polymorphism)
    同一操作作用于不同类的实例会产生不同行为
    通过接口和抽象类实现

  4. 抽象(Abstraction)
    提取关键特征而忽略非必要细节
    通过抽象类和接口实现

OOP的重要组成部分

  1. 类(Class)

    对象的蓝图或模板:

    class Animal { /* ... */ }
    
  2. 对象(Object)

    类的具体实例:

    "new"关键字用于创建对象

    $dog = new Animal();//$dog是Animal类的一个对象 
    
  3. 属性(Property)

    类/对象的特征或数据(也称为成员变量):

    public $name;
    private $age;
    
    • public修饰的属性可以从类外部直接访问

    • private修饰的属性只能在类内部访问

  4. 方法(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文件中存在可利用的类,类中有魔术方法

posted @ 2025-04-18 22:34  llz233  阅读(41)  评论(0)    收藏  举报