【超详细讲解】什么是序列化和反序列化?

反序列化(Unserialize)漏洞详解 序列化和反序列化漏洞分析   序列化(serialize) 就将对象的状态信息转换为可以存储或传输的形式的过程 在序列化期间,对象将当前的状态写入到临时或持久性的存储区 【将状态信息保存为字符串】。   反序列化(unserialize) 就是把序列化之后的字符串在转化为对象。 其实在序列化的过程中是没有任何的漏洞的,产生漏洞的主要的原因就是在反序列化的过程中,通过我们的恶意篡改会产生魔法函数绕过,字符逃逸,远程命令执行等漏洞,最早发现这些漏洞的大佬是真的牛。 一、简单的魔法函数 魔法函数 调用 阅读详情

目录

一、什么是序列化(Serialization)?

举个直观的例子

二、什么是反序列化(Deserialization)?

三、为什么需要序列化?

四、常见的序列化格式对比

五、序列化底层是怎么做的?

序列化过程:

反序列化过程:

六、序列化/反序列化常见坑

七、实际工程中应该怎么做?

八、总结

在实际项目开发中,“序列化(Serialization)”和“反序列化(Deserialization)”几乎无处不在。
但很多刚入门的同学,对它们的理解还停留在“转成字符串、传来传去”这么简单的层面。
其实,序列化的作用、原理、选择不同序列化协议的考量、安全风险、性能优化,每一个点都值得深入探讨!

一、什么是序列化(Serialization)?

序列化是将对象的状态转换为可存储或可传输格式的过程。

对象在内存中一般以特定的数据结构(指针、引用、哈希表、链表等)存在,直接传输内存数据是不可靠的(不同机器架构不同、数据对齐不同、指针无意义等问题)。

所以我们需要将对象转换成连续的字节流(或标准格式的文本),使得:

  • 可以写入磁盘文件

  • 可以通过网络发送到远端

  • 可以被其他进程或设备正确解析

简单来说,序列化是让数据“离开内存,去旅行”的必备装备。

举个直观的例子

C++中的一个对象:

struct User {
    std::string name;
    int age;
};
User u{"Alice", 24};

序列化后,可能得到这样一段JSON字符串:

{"name": "Alice", "age": 24}

或者变成一段二进制流,比如:

[0x05][Alice][0x18]

二、什么是反序列化(Deserialization)?

反序列化就是序列化的逆过程。

把收到的字节流或文本格式数据,还原成内存中的对象或数据结构,供程序继续操作。

比如:

  • 从磁盘读取一段JSON数据

  • 解析网络收到的一段Protobuf消息

  • 把Redis里缓存的对象取出来恢复成原始对象

这些都是反序列化的应用。

三、为什么需要序列化?

我们来列一下常见场景:

应用场景为什么需要序列化
网络通信TCP/UDP传输的数据必须是字节流,无法直接传对象
本地持久化把程序状态保存到磁盘,下次能恢复
跨平台数据交换不同系统、不同语言之间必须用标准格式
缓存系统Redis、Memcached存的是序列化后的对象
消息队列Kafka、RabbitMQ里的消息通常也是经过序列化的
RPC调用gRPC、Thrift调用远端服务需要将请求和响应序列化

没有序列化,现代分布式系统、微服务体系几乎无法正常运作!

四、常见的序列化格式对比

不同场景适合不同的序列化格式,常见的几种包括:

格式优点缺点典型应用
JSON人类可读、跨平台、广泛支持体积大、解析慢前后端接口、配置文件
XML结构复杂、可扩展性好体积更大、解析更慢SOAP服务、老系统
Protobuf体积小、速度快、强类型定义不易读、需要提前定义proto文件gRPC、分布式系统内部通信
MessagePack比JSON小、解析快不如Protobuf精简移动端、缓存系统
FlatBuffers零拷贝、超高速访问使用复杂、生成文件较大游戏开发、大量实时数据场景
Avro支持Schema进化(动态变化)较重大数据(Hadoop生态)

▶ 简单总结:

  • 传给人看的用 JSON

  • 高性能通信用 Protobuf

  • 体积敏感场景用 MessagePack/FlatBuffers

  • 大数据流用 Avro

五、序列化底层是怎么做的?

不同协议实现不一样,但总体过程类似:

序列化过程:
  1. 遍历对象的各个成员

  2. 把成员名和值按照某种规则编码

  3. 将编码结果组织成二进制流或文本格式

反序列化过程:
  1. 按照协议解析字节流或文本

  2. 提取字段信息

  3. 重新创建对象并赋值

比如 Protobuf 就是通过 proto 文件定义消息结构,在序列化时将字段编号、数据值压缩成紧凑的二进制格式。

六、序列化/反序列化常见坑

  1. 版本兼容问题

    • 加字段、删字段时,旧版本客户端可能崩溃!

    • 解决方案:设计支持“向前兼容”和“向后兼容”的协议(比如 Protobuf 就支持)

  2. 性能瓶颈

    • 大对象频繁序列化/反序列化,CPU和内存开销大

    • 解决方案:缓存序列化结果、优化协议选择

  3. 安全风险

    • 反序列化时如果处理不当,可能被黑客注入恶意数据(反序列化漏洞)

    • 解决方案:只信任可信源数据、限制反序列化对象类型

  4. 浮点数精度问题

    • JSON等文本协议保存浮点数时可能丢失精度
  5. 指针、引用、共享对象问题

    • C++等语言中的裸指针、智能指针需要特别小心处理

七、实际工程中应该怎么做?

▶ 选好序列化协议

  • 轻量级API通信选JSON

  • 高性能微服务内部通信选Protobuf

  • 超高频、大量小数据可以考虑FlatBuffers

▶ 优化性能

  • 尽量复用对象

  • 预先分配好内存

  • 批量处理而不是逐条处理

▶ 注意安全问题

  • 不要反序列化不可信来源的数据

  • 限制反序列化类的白名单

  • 检查数据大小、结构合理性

八、总结

序列化和反序列化是现代系统数据流动的桥梁。

  • 序列化让数据可以跨内存、跨进程、跨机器传递;

  • 反序列化让数据回到可以操作的对象状态;

  • 正确、合理、安全地使用它们,是开发可靠系统的基础技能。

学习资源

如果你是也准备转行学习网络安全(黑客)或者正在学习,这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你

知识库由360智榜样学习中心独家打造出品,旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力,熟练掌握基础攻防到深度对抗。

1、知识库价值

深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。

广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。

实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。

2、 部分核心内容展示

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

在这里插入图片描述

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。

1、网络安全意识

img

2、Linux操作系统

img

3、WEB架构基础与HTTP协议

img

4、Web渗透测试

img

5、渗透测试案例分享

img

6、渗透测试实战技巧

图片

7、攻防对战实战

图片

8、CTF之MISC实战讲解

图片

3、适合学习的人群

‌一、基础适配人群‌

  1. ‌零基础转型者‌:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链‌;
  2. ‌开发/运维人员‌:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展‌或者转行就业;
  3. ‌应届毕业生‌:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期‌;

‌二、能力提升适配‌

1、‌技术爱好者‌:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者‌;

2、安全从业者‌:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力‌;

3、‌合规需求者‌:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员‌;

因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传优快云,朋友们如果需要可以在下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

反序列化漏洞详解 目录 一、什么是序列化和反序列化 二、什么是反序列化漏洞 三、序列化函数(serialize) 四、反序列化(unserialize) ​五、什么是PHP魔术方法 六、一些常见的魔术方法 七、魔术方法的利用 八、反序列化漏洞的利用 1.__destruct()函数 2.__wakeup() 3.toString() ​九、反序列化漏洞的防御 一、什么是序列化和反序列化 序列化是将对象转换为字符串以便存储传输的一种方式。而反序列化恰好就是序列化的逆过程,反序列化会将字符串. 阅读详情

相关推荐

深入浅出:序列化与反序列化的全面解析

在软件开发中,**序列化(Serialization)** 和 **反序列化(Deserialization)** 是两个非常重要的概念。它们涉及到数据的转换、传输和存储。本文将通过通俗易懂的语言和实际代码示例,帮助读者理解这两个过程,并探讨如何在不同的编程语言和应用场景中实现它们。

weixin_44435110的博客 3365

序列化与反序列化介绍

序列化与反序列化介绍

shsh1234567890的博客 1万+

Log4Shell漏洞复现:从原理到实战的完整指南

日志记录是软件开发中用于追踪应用状态和排查问题的关键技术。然而,当日志组件对用户输入进行不当解析时,可能引发严重的安全风险。Log4j2作为Java生态中广泛使用的日志框架,其Lookup功能允许在日志中动态插入变量,这一设计初衷虽为便利,却因递归解析机制埋下了隐患。攻击者通过构造特定的JNDI(Java命名和目录接口)查询字符串,可诱使应用加载并执行远程恶意代码,从而实现远程命令执行。这种漏洞的价值在于其极低的利用门槛和极高的潜在危害,常被用于渗透测试和安全评估中,以验证系统的防御能力。本文以CVE-20

weixin_30496999的博客 278

一文带你了解序列化与反序列化基本原理与操作

序列化是指将对象转换为字节序列的过程,以便于存储或传输。在序列化过程中,对象的状态信息将被转换为字节流,可以保存到文件中或通过网络传输给其他计算机。反序列化则是将字节序列恢复为对象的过程。通过反序列化操作,可以从存储的字节流中还原对象的状态。这使得可以在程序重启后,读取保存的字节流并重新构造对象,从而快速恢复对象的状态。在分布式系统中,可以将对象进行序列化,并在不同的计算机之间进行传输。接收方可以通过反序列化操作将字节序列转换为可操作的对象。某些远程通信框架使用序列化和反序列化来实现远程方法调用。

m0_68987535的博客 1万+

AWS RDS 介绍 三)创建 RDS 实例

AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.

XuYongshi02的专栏 7648

别再手动配IP了!保姆级教程:用Cisco Packet Tracer搞定DHCP服务器配置(附实验抓包分析)

本文提供了一份详细的Cisco Packet Tracer DHCP服务器配置教程,帮助用户告别手动分配IP的繁琐过程。通过构建多子网实验环境,逐步指导DHCP地址池设置、客户端测试及协议分析,并分享常见问题排查技巧,让网络配置更高效、更智能。

weixin_42535461的博客 341

JSON 序列化和反序列化 讲解

一、什么是JSON 数据 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 是JavaScript用来处理数据的一种格式,大部分是用来处理JavaScript和web服务器端之间的数...

天马3798 8484

PHP证书图片生成

$realname = "姓名"; $schoolname = "学校"; $idcard = "身份证号"; $image = imagecreatefrompng('certification.png'); // 证书模版图片文件的路径 $red = imagecolorallocate($image,00,00,00); // 字体颜色

4037

详解C# 序列化和反序列化

今天我利用这篇文章给大家讲解一下 C# 中的序列化与反序列化。这两个概念我们在开发中经常用到,但是我们绝大部分只用到了其中的一部分,剩下的部分很多开发人员并不清楚,伸着可以说是不知道。因此我希望通过这篇文章能让各位对序列化和反序列化的知识有更进一步的掌握。废话不多说开始进入正题。 零、什么是序列化/反序列化 在所有的开发语言中都存在序列化和反序列化这个概念,所谓的序列化就是把一个对象信息转化为一个...

喵叔 5085

深入AOSP构建系统:从BUILD_FINGERPRINT的生成逻辑,看如何定制你的Android设备标识

本文深入解析AOSP构建系统中的设备指纹生成机制,详细介绍了BUILD_FINGERPRINT的生成逻辑及其在Android设备中的关键作用。通过分析多个指纹属性的区别与联系,以及如何定制设备标识,帮助开发者更好地理解和掌握Android系统构建过程。

weixin_27017211的博客 223

大连理工大学中文情感词汇本体库(含情绪分析代码)

中文文本数据的情绪计算昨天如何对微博推文进行情绪分析(细粒度情感分析)介绍了英文的NRC情绪词典。虽然支持中文,但由于制作问题,导致并不完全适应中文场景。今天介绍大连理工大学中文情感...

大邓和他的Python 4万+

Java反序列化攻击通俗讲解

想象一下,你把一只猫放进冰箱(序列化),需要时再拿出来(反序列化)。但黑客偷偷把冰箱里的猫换成了老虎(恶意代码),当你打开冰箱时——砰!老虎跳出来咬你一口!这就是Java反序列化攻击的可怕之处。

weixin_43172311的博客 2404

C#上位机玩转OPC UA:从服务器搭建到数据订阅(西门子S7-1200/欧姆龙CP1E全案例)

服务器搭建:C#可快速搭建OPC UA服务器,适配无原生OPC UA的PLC(如欧姆龙CP1E),统一数据交互接口;客户端开发:核心实现“自动重连、批量订阅、异步处理”,满足工业场景7×24小时稳定运行需求;PLC对接:西门子S7-1200可直接对接原生OPC UA,欧姆龙CP1E需通过网关中转,重点注意地址格式与通信参数匹配。本文提供的代码已在3C产线、自动化流水线等场景落地验证,可直接复用核心模块,仅需根据实际PLC型号调整节点映射与通信参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 765

PHP序列化和反序列化

PHP序列化和反序列化及案例

qq_31088019的博客 4701

【C语言趣味教程】(0) 专栏介绍

这是一套C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅!本专栏保证篇篇精品,继续保持本人一贯的幽默式写作风格,当然,在有趣的同时也同样会保证文章的质量,旨在能够产出"有趣的干货" !本系列教程不管是零基础还是有基础的读者都可以阅读,可以先看看目录!标题前带星号 (*) 的部分不建议初学者阅读,因为内容难免会超出当前章节的知识点,面向的是对 C 语言有一定基础或已经学过

有道无术, 术尚可求。有术无道, 止于术。 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JAVASE序列化和反序列化讲解

文章目录序列化常见问题标志性接口序列化版本号有什么用?序列化对象Studentmain实现截图序列化集合反序列化反序列化对象反序列化集合判断反序列化是否是集合反序列化集合代码注意transientStudent类注意反序列化代码序列化代码执行结果name为NULL解释:序列化版本号有什么用?java语言中是采用什么机制来区分类的?举例讲解这种自动生成序列化版本号有什么缺陷?最终结论: 序列化 1.序列化:Serialize java对象存储到磁盘文件中,将java对象的状态保存下来的过程 (Object

寻梦&之璐 3664

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

反序列化漏洞分析讲解

一、什么是反序列化 1.1 漏洞简介 PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存在于Java、Python等语言之中,但其原理基本相通。 1.2反序列化函数 在我们讲PHP反序列化的时候,基本都是围绕着serialize(),**uns

明哥哥知识分享 2876

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

序列化和反序列化

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。

fjh_ready_sonaa的博客 862

序列化和反序列化的区别

首先我们来了解为什么需要序列化 卖个关子,大家玩游戏的时候,相信都知道【存档】的功能吧,每次我们重新进入游戏的时候,直接载入存档就可以了,不用重新在重头开始,这样我们的游戏也不会丢失 从面向对象的思维考虑,万事万物皆对象,我们游戏中的角色,怪兽,装备等等都可以看做是对象 我们再从计算机思维考虑,创建的对象其实都是保存在内存中的,想必大家都知道内存中存储的数据只是暂时性的,断电之后是会消失的,但是游戏如果你手动存档之后就算你几天之后在开机,再次读取存档就可以了,这就很奇怪了,为什么断电之后我得装备和人物信

study_665的博客 5620

python 序列化和反序列化

一 概述 1 为什么要序列化 因为TCP/IP协议只支持字节数组的传输,不能直接传对象。对象序列化的结果一定是字节数组!当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。 2 序列化和反序列化 序列化(serialization):及有序...

1760

PHP反序列化

学习反序列化

这个人很懒,什么都懒得写 1002

java string 反序列化_java序列化和反序列化

引语:平时我们在运行程序的时候,创建的对象都在内存中,当程序停止或者中断了,对象也就不复存在了.如果我们能将对象保存起来,在需要使用它的时候在拿出来使用就好了,并且对象的信息要和我们保存时的信息一致.序列化就可以解决了这样的问题.序列化当然不止一种方式,如下:序列类型是否跨语言优缺点hession支持跨语言,序列化后体积小,速度较快protostuff支持跨语言,序列化后体积小,速度快,但是需要S...

weixin_29114331的博客 2912

反序列化漏洞3之java序列化与反序列化

定义: 反序列化漏洞是一种在多种编程语言中存在的典型漏洞,特别是在JAVA中。特点: 不同的编程语言具体的利用细节和影响的范围不一样,但概念类似。定义: Vulhub是一个国产的靶场平台,收集了众多中间件漏洞。功能: 支持一键搭建漏洞测试靶场,方便进行漏洞研究和复现。漏洞数量: 目前大概有100多个漏洞,其中反序列化的漏洞就有20多个。使用方式: 通过docker-compose up -d命令启动漏洞环境。课程重点: 本节课将讲解JAVA的反序列化漏洞。

jonhswei的博客 888
上一篇: 【新手入门】SQL注入之报错注入
下一篇: 手把手教你如何进行内网渗透:从零基础到实战突破(非常详细)从零基础入门到精通,收藏这篇就够了
网络安全_入门教程
博客等级 码龄4年 1万+粉丝 2151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值