php自动序列化,PHP序列化

本文深入探讨了PHP的序列化和反序列化过程,详细解析了序列化字符串的含义,并介绍了PHP中的魔术方法,如__construct、__destruct和__toString。文章还提到了PHP反序列化漏洞,特别是__wakeup()方法的绕过情况,并指出在特定版本的PHP中存在相关安全风险。最后,列举了一些魔术方法在对象生命周期中的关键作用。
摘要由CSDN通过智能技术生成

说到PHP反序列化,首先要了解什么是序列化

PHP里面有关序列化的两个函数:

serialize:序列化 :把一个对象转成字符串形式, 可以用于保存

unserialize: 反序列化:把serialize序列化后的字符串变成一个对象

看如下代码

class User

{

public $age = 0;

public $name = '';

public function PrintData()

{

echo 'User ' . $this->name . ' is ' . $this->age

. ' years old.
';

}

}

$usr = new User();

$usr->age = 20;

$usr->name = 'John';

$usr->PrintData();

echo serialize($usr);

?>

先运行一下代码

393adb9e4486eec89431ccce257d24bd.png

输出了User这个类序列化后的字符

下面说下这个序列化的字母的意思

O:类的缩写

4:类名User的长度为4

User:类名

2:两个成员变量

s :成员变量的类型string

3:age的长度为三

age:变量的名字

i:成员变量的类型int

20:为成员变量赋的值

后面的部分以此类推

首先了解一下php中的魔术方法:

php类可能会包含一些特殊的函数叫magic函数,magic函数命名是以符号__开头的,比如 __construct, __destruct, __toString, __sleep, __wakeup等等。

这些函数在某些情况下会自动调用,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串使用。

为了更好的理解magic方法是如何工作的,在2.php中增加了三个magic方法,__construct, __destruct和__toString。

可以看出,__construct在对象创建时调用,__destruct在php脚本结束时调用,__toString在对象被当作一个字符串使用时调用。

__construct 当一个对象创建时被调用,

__destruct 当一个对象销毁时被调用,

__toString 当一个对象被当作一个字符串被调用。

__wakeup() 使用unserialize时触发

__sleep() 使用serialize时触发

__destruct() 对象被销毁时触发

__call() 在对象上下文中调用不可访问的方法时触发

__callStatic() 在静态上下文中调用不可访问的方法时触发

__get() 用于从不可访问的属性读取数据

__set() 用于将数据写入不可访问的属性

__isset() 在不可访问的属性上调用isset()或empty()触发

__unset() 在不可访问的属性上使用unset()时触发

__toString() 把类当作字符串使用时触发,返回值需要为字符串

__invoke() 当脚本尝试将对象调用为函数时触发

PHP反序列化漏洞

PHP反序列化漏洞又称PHP对象注入,是因为程序对输入数据处理不当导致的

一、__wakeup( )绕过

(CVE-2016-7124)

反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup( )的执行。

影响版本:

PHP before 5.6.25

7.x before 7.0.10

当目标对象被private、protected修饰时的构造方法。

用%00绕过

未完待续。。。。。。。

标签:__,触发,PHP,对象,调用,序列化

来源: https://blog.csdn.net/Mars748/article/details/102770284

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值