反序列化漏洞1-PHP序列化基础概念(0基础超详细)

一.PHP序列化基础概念

       首先当我们看到反序列化漏洞这个概念,我们的第一个问题是什么是反序列化?那么我们要知

道什么是反序列化就要知道什么是序列化。

        序列化就是可以将一个对象压缩并格式化成字符串,可以将该对象保存下来,以便存储及运

输。那么问题又来了,我们为什么要对对象这么做呢?因为在PHP中对象在你的代码执行过后会自

动销毁。所以你要想将对象保存下来的话就要通过序列化将对象按照固定的格式将对象压缩并格式

化转化成字符串这样就可以将对象保存下来了,其实不进行序列化将对象保存在数据库也是ok的。

        很多对象是在用户端产生,而用户没有权限将对象保存在数据库中,所以通过序列化将对象

压缩并格式化成字符串,然后传输给服务器,让服务器去进行保存到数据库。

        那么反序列化的概念也就很简单了:就是当我们要用对象时,将序列化的字符串进行还原成

对象。

二.学习序列化要了解的基本内容。

类(Class): 类的定义包含了数据的形式以及对数据的操作。
对象:对象是类的实例。
方法:类中定义的函数。
属性:函数中的变量。
       类是由很多个方法组成的,举例:我们有一个查询用户信息的功能点,而查询信息的方法有很
多,我们就把他划为一类,实际上方法也就是我们自定义的函数对于一些功能点。
 
       而对象是指当我们去调用某一个方法时不可能去crtl+c,ctrl+v去使用某一方法。计算机会使用
内存去调用,及当某一个用户去调用某一功能点时,用户电脑内存会创造一个实例也就是对象,对
象中含有所有要调用的方法,然后程序调用的是对象中的方法。

三.PHP序列化函数及序列化过程介绍

serialize() //将一个对象转换成一个字符串
代码示例:
<?php
//创建一个类 Test
class Test
{
//定义 3 个属性,最后序列化后看一下这 3 个属性序列化后的结果。(属性a,b,c)
private $a = "private";
public $b = "public";
protected $c = "protected";
}
//创建一个对象,对象是类的实例。(test就是创建的实例)(new就是创建对象的特征)
$test = new Test();
//序列化 test 这个对象
$data = serialize($test);
//打印序列化后的对象
echo $data;
?>
那么我们来看看序列化后的字符串长什么样子:
我们来观察一下这段序列化后的字符串:
O:4:"Test":3:{s:7:"Testa";s:7:"private";s:1:"b";s:6:"public";s:4:"*c";s:9:"protected";}

字符串解释

括号前

O指的是object(对象)
4指的是Test这个对象有4个字符
Test就是类名称。
3就是指的这个类里面有几个属性,(这里面有a,b,c三个属性)。

括号里

而方括号里的就是对应三个属性的字段了:
s:7:"Testa";s:7:"private"
s:1:"b";s:6:"public"
s:4:"*c";s:9:"protected"
s表示string字符串,前面s:7:"Testa"表示变量的名字,s:7:"private"后面表示变量名的值。
里面的7表示变量名的长为7个字符。为什么Testa是5个字符为什么表示7个,原因是名字中存在不可见字符,在字符左右,private定义Testa是一个私有的变量存在在Test里面。
public类型公用的,b就是一个字符,后面public也就是6个字符。
protected类型是指受保护类型,指的是在这个类及这个子类里面都可以使用,
*c,4个名字长度,很明显不符合,其实是  00*00c,在*左右存在两个不可见字符,而*表示当前类及其子类。

四.反序列化函数及反序列化过程介绍

unserialize()  //反序列化

代码示例:
<?php
//创建一个类 Test
class Test
{
//定义 3 个属性,最后序列化后看一下这 3 个属性序列化后的结果。(属性a,b,c)
private $a = "private";
public $b = "public";
protected $c = "protected";
}
//创建一个对象,对象是类的实例。(test就是创建的实例)(new就是创建对象的特征)
$test = new Test();
//序列化 test 这个对象
$data = serialize($test);
//打印序列化后的对象
echo $data;
//反序列化data这个对象
$fjw = unserialize($data);
//打印反序列化后的对象
var_dump($fjw);
?>
我们在源代码后添加了两行。
我们观察反序列化后的代码:
object(Test)#2 (3) {
["a":"Test":private]=>
string(7) "private"
["b"]=>
string(6) "public"
["c":protected]=>
string(9) "protected"
}
与最原始的基本没差别。、
注意:因为有不显示空白字符的存在,我们在传输一段字符串的时候不能直接进行传世,因为空白字符无法打字打上去,所以我们通常对字符串进行base64加密后再进行传输。

五.空白字符帮助理解

不理解的话举例:
我们创建一个unserialize.php
这里我们对于空白字符用空格替换,因为要与前面的字符长度表示一致
直接对原字符串进行反序列化:
我么可以看到" Test a"但实际我们的变量名只有一个a,是因为我们这里没法表示空白字符,只能用空格代替表示,所以和我们原来的数据还是有差异的。
所以在传输字符串的时候如果直接传输会存在数据丢失的情况,所以我们通常使用base64加密后再传输就可以避免这种情况。

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

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

相关文章

【微服务】Ocelot微服务网关

目录 一、目的 二、Ocelot介绍 三、.Net中使用Ocelot搭建网关服务 3.1 搭建网关Ocelot步骤 3.1.1、创建Net7 WebApi服务 3.1.2、Nuget引入-Ocelot程序包&#xff08;版本&#xff1a;19.0.2&#xff09; 3.1.3、配置中间件和IOC注册 3.1.4 配置文件编辑Ocelot网关配置信…

零基础入门:用按键精灵实现视频自动操作(附完整脚本)

摘要&#xff1a;本文手把手教你编写视频平台的自动化脚本&#xff0c;涵盖点击、循环、防检测等核心技巧&#xff0c;无需编程基础&#xff0c;轻松实现自动播放/点赞/跳过广告。&#xff08;使用按键精灵2024版演示&#xff09; 一、应用场景 自动化操作&#xff1a;自动跳过…

AI(学习笔记第六课) 使用langchain进行AI开发 load documents(csv和文件夹)

文章目录AI(学习笔记第六课) 使用langchain进行AI开发 load documents(csv和文件夹)学习内容&#xff1a;1.load documents&#xff08;csv&#xff09;1.1 学习url1.2 load csv文件1.2.1 默认load1.2.2 csv文件内容1.2.2 执行csv文件的load1.3 Customizing the CSV parsing an…

企业运维实战:Jenkins 依赖 JDK21 与应用需 JDK1.8 共存方案(含流水线配置)

前言&#xff1a;在企业运维中&#xff0c;“工具升级”与“业务兼容”的平衡始终是核心挑战。近期我们遇到一个典型场景&#xff1a;Jenkins 升级到 2.450 版本后&#xff0c;强制要求 JDK21 运行环境&#xff1b;但开发团队的应用程序因框架依赖&#xff0c;必须使用 JDK1.8 …

爬虫小知识三:selenium库

前言 selenium 库是一种用于 Web 应用程序测试的工具&#xff0c;它可以驱动浏览器执行特定操作&#xff0c;自动按照脚本代码做出单击、输入、打开、验证等操作&#xff0c;支持的浏览器包括 IE、Firefox、Safari、Chrome、Opera 等。 与 requests 库不同的是&#xff0c;se…

Jmeter使用 -1

1 接口测试1.1 为什么要进行接口测试接口测试能够绕过前端校验&#xff0c;对后端的接口处理逻辑进行测试&#xff08;数据的边界/格式/类型&#xff09;在一些需要重复测试的需求中&#xff0c;接口自动化的效率比手工执行效率高1.2 接口测试流程熟悉API接口文档&#xff08;接…

GitHub 趋势日报 (2025年07月16日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图2415markitdown570claude-code434ART330erpnext150MusicFree146rustdesk129vanna80…

Python+Tkinter制作音频格式转换器

我们将使用Python的Tkinter库来构建一个音频格式转换器界面。由于音频转换需要实际的处理&#xff0c;我们将使用pydub库&#xff08;需要安装&#xff09;来进行音频格式转换。同时&#xff0c;我们会使用ffmpeg作为后端&#xff0c;因此请确保系统中已安装ffmpeg并添加到环境…

Haproxy算法精简化理解及企业级高功能实战

文章目录4. Haproxy的算法4.1 静态算法4.1.1 static-rr&#xff1a;基于权重的轮询调度1. 示例&#xff1a;4.1.2 first1. 示例2. 测试效果&#xff1a;4.2 动态算法4.2.1 roundrobin1. 示例2. 动态调整权重4.2.2 leastconn1. 示例4.3 其他算法4.3.1 source1. 示例2. 测试4.3.2…

git fork的项目远端标准协作流程 仓库设置[设置成upstream]

这是一个在开源协作中非常常见的配置。 简单来说&#xff0c;upstream 在这里指的是你 Fork 来的那个原始的、官方的仓库。 下面我们来详细解释一下这个 git remote -v 输出的含义&#xff1a; 1. 两条“遥控器” (Remotes) 你的 git 配置了两个远程仓库的地址&#xff0c;就像…

[FFmpeg] 输入输出访问 | 管道系统 | AVIOContext 与 URLProtocol | 门面模式

链接&#xff1a;https://trac.ffmpeg.org/ docs&#xff1a;FFmpeg FFmpeg 是一个强大的多媒体框架&#xff0c;旨在处理媒体处理的各个阶段。 它就像一个数字媒体工厂&#xff0c;包含以下部门&#xff1a;打包/解包&#xff08;容器处理&#xff09;、 转译/压缩&#xff…

微服务的编程测评系统2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言工程创建创建ck-oj创建oj-modules创建具体微服务oj-system推送码云管理员登录逻辑分析docker安装mysqldocker客户端docker desktop安装安装mysqlmysql-plus和数据…

AR智能巡检:电力运维的数字化变革

在电力行业快速发展的当下&#xff0c;传统运维方式已难以满足现代电网对高效、安全的需求。近年来&#xff0c;增强现实&#xff08;AR www.teamhelper.cn &#xff09;技术的兴起为电力巡检带来了全新的解决方案。通过实时数据可视化、远程协作和智能分析&#xff0c;AR技术…

NeRF和3DGS原理详细

NeRF和3DGS一、传统三维表征方法1.1 显示表征1.2 隐式表征二、NeRF&#xff08;Nerual Radiance Field&#xff09;2.1 NeRF场景表示2.2 NeRF训练流程2.3 NeRF体渲染2.4 NeRF位置编码2.5 NeRF体素分层采样&#xff08;Volume Hierarchical Sampling&#xff09;2.6 NeRF网络结构…

035_ClaudeCode_MCP_介绍

035_ClaudeCode_MCP_介绍 摘要 Model Context Protocol&#xff08;MCP&#xff09;是一个开放的标准化协议&#xff0c;专为大型语言模型提供上下文数据而设计。作为Claude Code生态系统的重要组成部分&#xff0c;MCP如同"AI应用程序的USB-C端口"&#xff0c;提供…

Python 程序无法找到 Oracle 的 64 位客户端库 (libclntsh.so)

数据库错误: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help 这个错误表明 Python 程序无法找到…

Kubernetes常用命令总结

文章目录Kubernetes常用命令总结1. 集群管理命令kubectl cluster-infokubectl get nodeskubectl describe node <node-name>kubectl top nodes2. Pod相关命令kubectl get podskubectl get pods -o widekubectl describe pod <pod-name>kubectl logs <pod-name&g…

roboflow使用教程

如何利用roboflow标注自己的训练集、调用开源数据集 官网&#xff1a;Roboflow: Computer vision tools for developers and enterprises&#xff08;国内代理进不去&#xff09; 先注册登陆进去 训练自己的数据集 点击“New Project”,名字按照自己的需求来 我不想写了&am…

IDEA中使用Tomcat两种方式

Catalogue1 集成本地Tomcat2 Tomcat Maven插件&#xff08;推荐&#xff09;1 集成本地Tomcat 将本地Tomcat集成到Idea中&#xff0c;然后进行项目部署即可 点击编辑配置 点击加号 添加local的Tomcat 配置Application Server 可以修改一下Name 至此&#xff0c;配置完成 …

服务器上的文件复制到本地 Windows 系统

在 Windows 上通过 SSH 连接到 Linux 服务器后&#xff0c;如果需要将服务器上的文件复制到本地 Windows 系统&#xff0c;可以使用以下几种方法&#xff1a;方法 1&#xff1a;使用 scp&#xff08;Secure Copy&#xff09;命令 scp&#xff08;基于 SSH 的安全复制&#xff0…