1. PHP 类与对象类:一组共享相同结构和和行为的对象集合
    对象:类的实例 使用new的关键字

Php magic函数

在PHP中,魔术方法(Magic Methods)是一组特殊的函数,它们以双下划线(__)作为前缀来命名。这些函数在特定的情况下会自动调用,以执行一些特定的操作。以下是一些常用的魔术方法:

PHP反序列化漏洞笔记(一):初识序列化_PHP


PHP反序列化漏洞笔记(一):初识序列化_PHP_02


实践:

PHP反序列化漏洞笔记(一):初识序列化_字符串_03

PHP反序列化漏洞笔记(一):初识序列化_网络安全_04


自动化的操作:魔术方法在特定的情况下会被自动调用,无需手动调用,从而减少冗余的代码。例如,__construct() 方法会在对象创建时自动调用,__destruct() 方法会在对象销毁时自动调用,这样可以方便地进行初始化和资源释放操作。

动态属性和方法控制:通过 __get()、__set()、__isset()、__unset() 方法,可以动态地获取、设置、判断和删除对象的属性。通过 __call() 和 __callStatic() 方法,可以动态地捕获和处理未定义的方法调用。这样可以实现属性和方法的动态控制,增加了代码的灵活性。

自定义对象输出:通过 __toString() 方法,可以自定义对象被转换为字符串时的输出格式。这样可以对对象的展示形式进行定制,便于调试和日志记录。

对象的克隆控制:通过 __clone() 方法,可以对对象的克隆行为进行控制

  1. PHP 的序列化和反序列化

Php 对象存活时是在内存里面,我们可以访问对象的属性和方法,一旦代码运行完毕,对象就消亡了,对象访问不到了,那我们能不能将对象以某种形式存储起来,之后继续使用或者远程传递到别的地方去使用这时,序列化就出现了。

序列化是将数据结构或对象转换为可存储(一般是字符串)或传输的形式,使其能够在不同的系统或平台上进行存储、传输和恢复的过程。

PHP反序列化漏洞笔记(一):初识序列化_PHP_05




序列化演示

我们定义一个class 有公有属性,私有属性还有方法:

PHP反序列化漏洞笔记(一):初识序列化_字符串_06



序列化的结果

PHP反序列化漏洞笔记(一):初识序列化_PHP_07



第1个 为int类型,所以标号为i, 值为32,序列化的结果为i:32;为5个字符,长度为string(5)


第2个 为string类型,所以标号为s, 字符长度为4 wuya,序列化的结果为s:4:wuya

;为11个字符,长度为string(11)


第3个 为布尔类型,所以标号为b, 值为1,序列化的结果为b:1;,为4个字符,长度为string(4)


第4个 为null类型,所以标号为N, 序列化的结果为N;为2个字符,长度为string(2)


第5个 为数组类型,所以标号为a, array里面有2个,所以值为a:2,两个值里面有键值,序列化为int与字符串类型,加起来总长度为34个字符,长度为string(34)


第6个 为对象类型,所以标号为object, 值为10(对象的名字),里面有两个属性data和pass

data 的值是字符串,他们序列化后都是string,但是pass是私有属性,序列化是会调用本身的class,所以序列化的是类的名字+私有属性的名字SerialTypepass,而不是pass单独的名字,他的值为true是第2个的布尔类型,所以序列化为b:1.





除了有php的序列化,还有其他序列化的格式

PHP反序列化漏洞笔记(一):初识序列化_字符串_08



PHP反序列化漏洞笔记(一):初识序列化_网络安全_09


PHP反序列化漏洞笔记(一):初识序列化_网络安全_10



PHP反序列化演示

PHP反序列化漏洞笔记(一):初识序列化_PHP_11




反序列化注意

PHP反序列化漏洞笔记(一):初识序列化_字符串_12

PHP反序列化漏洞笔记(一):初识序列化_序列化_13

PHP反序列化漏洞笔记(一):初识序列化_序列化_14