代码改变世界

【session反序列化】 - 指南

2025-09-21 14:02  tlnshuju  阅读(11)  评论(0)    收藏  举报

一、session 存储方式回顾

PHP 内置了多种处理器用于存储 $_SESSION 数据时会对数据进行序列化和反序列化,常用的有以下三种,对应三种不同的处理格式:

php 键名+竖线(|)+经过serialize()函数处理过的值

php_binary 键名的长度对应的ascii字符+键名+经过serialize()函数序列化后的值

php_serialize 经过serialize()函数处理过的值,会将键名和值当作一个数组序列化

在这里插入图片描述

二、session处理器使用不当带来的问题

第一种

在这里插入图片描述

查看session文件保存的内容,直接把session数组序列化后存储

在这里插入图片描述
若是在读取的时候把引擎改成php
在这里插入图片描述
在这里插入图片描述
php引擎会把竖线前面的值认为是键名,竖线后面的值认为是value
在这里插入图片描述
读取后,就把竖线前面的值认为是key,后面的值经过反序列化后被读取成了对象
在这里插入图片描述
所以这就是处理器使用不当带来的问题
在这里插入图片描述

第二种

在这里插入图片描述
这里有一个wakeup和destruct方法
在这里插入图片描述
_wakeup方法当类的对象被反序列化后会自动调用这个方法

_destruct方法当类的对方被销毁的时候会自动调用这个方法

当我们给foo1.php文件,通过get方法传入数据,通过php_sserialize方法保存数据

|O:4:"0wo0":1:{
s:2:"hi";
s:4:"2333";
}

这时通过foo2.php文件,通过php引擎读取数据时,就会被竖线分割,竖线之前的为key,竖线之后的为value,竖线后面的数据会被反序列化,我们上面传入的是Owo0类序列化后的结果,就相当于它反序列化了一个对象,因为Owo0类有魔术方法,所以触发反序列化时会自动触发魔术方法_wakeup,执行里面的代码

传入后保存的session文件变成了
在这里插入图片描述
用php读取,竖线前面变成了key
在这里插入图片描述
竖线后面就是value,并且是序列化后的结果,读取的时候就会进行反序列化
在这里插入图片描述
运行后,当类被反序列化时会自动调用_wakeup方法,输出hi,当这个对象被销毁时,会自动调用_destruct方法输出hi变量里面的2333
在这里插入图片描述

三、session 监测上传进度

session相关设置选项含义

在这里插入图片描述
session.upload_progress.cleanup默认是开启的,但在实验中需要关闭
在这里插入图片描述
在这里插入图片描述
测试代码:

<?php
session_start();
var_dump($_SESSION);

对应的上传表单:

<form action="sess1.php" method="POST" enctype="mul