【Web】关于FastJson反序列化开始前的那些前置知识

目录

FastJson介绍

FJ序列化与反序列化方法

关于反序列化三种方式的关系与区别

FastJson反序列化漏洞原理通识

关于getter&setter


FastJson介绍

FastJson(快速JSON)是一个Java语言编写的高性能、功能丰富且易于使用的JSON解析和序列化库。它由阿里巴巴集团开发,提供了一种快速、高效的方式来处理JSON数据。

FJ序列化与反序列化方法

序列化:JSON.toJSONString()
参数设置:SerializerFeature.WriteClassName 序列化时,会多出一个@type跟上类名


反序列化:JSON.parseObject()
参数设置:Feature.SupportNonPublicField 反序列化时,加上该参数才能还原private属性

关于反序列化三种方式的关系与区别


fastjson 处理反序列化的方式主要有三种

1、Object obj = JSON.parse(jsonstr);
2、Object obj = JSON.parseObject(jsonstr, UserFastJson.class);
3、Object obj = JSON.parseObject(jsonstr);

①JSON.parseObject(jsonstr) 和 JSON.parseObject(jsonstr,UserFastJson.class)输出的结果一致,都是执行了构建器以及setter方法。JSON.parseObject(jsonstr) 处理方式,不仅仅执行了构建器,还执行了所有的setter、getter方法


②JSON.parse(jsonstr)与JSON.parseObject(jsonstr, UserFastJson.class)可以认为是完全一样的,最后得到的是具体类对象,而parseObject(String text)是在二者的基础上又执行了一次JSON.toJSON(),其先遍历所有的setter方法,然后再遍历getter方法,最后得到的是JSONObject类对象

也就是说JSON.parseObject()本质上还是调用JSON.parse()进行反序列化的,区别是parseObject()会额外调用JSON.toJSON()来将Java对象转为JSONObject对象。

③fastjson支持使用@type指定反序列化的目标类

JSON.parse(jsonString) 和 JSON.parseObject(jsonString, Target.class),前者会在 jsonString 中解析字符串获取 @type 指定的类,后者则会直接使用参数中的class。

FastJson反序列化漏洞原理通识

若能找到一个类、在反序列化这个类对象时,fastjson调用其setter或getter方法,且setter或getter方法存在漏洞,可以执行恶意代码。

这也是FJ反序列化漏洞与基于readObject的其他反序列化漏洞的最大区别。

此外,fastjson 在反序列化时,如果 Field 类型为 byte[],将会调用com.alibaba.fastjson.parser.JSONScanner#bytesValue 进行 base64 解码,对应的,在序列化时也会进行 base64 编码。

关于getter&setter


fastjson 在为类属性寻找 getter&setter 方法时,调用函数 com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer#smartMatch() 方法,会忽略 _|- 字符串

满足条件的setter方法:

函数名大于等于4,非静态函数,以set开头且第4个字母为大写,返回类型为void或当前类,参数个数为1个

满足条件的getter方法:

函数名长度大于等于4,非静态方法,以get开头且第4个字母为大写,无参数,返回值类型继承自Collection或Map或AtomicBoolean或AtomicInteger

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

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

相关文章

python梅花易数,python算卦

2024-02-28 python梅花易数,python算卦,梅花易数的三数起卦 前言:本来想搜来直接复制的,结果看目前找到的都有些问题,特意去看了梅花易数的视频,写了个。想法被拿捏的死死的,不如相信算卦 # …

在docker中玩flink时候记录一些组合命令

前言 玩docker的时候记录一些组合命令,一方面是可以直接拿上来使用,还有的话也可以拿过来改改,主要是我自己有这种经历,过一阵子我自己也忘,与其去搜人家的博客还不如自己记录一把。好了,没啥所谓的规律性…

第8章:Nginx与Web应用《Nginx实战:从入门到精通》

Nginx不仅仅是一个高效的静态内容服务器和反向代理服务器,它还能与各种流行的Web应用框架和语言环境无缝集成,从而提供强大的动态内容处理能力。在本章中,我们将深入探讨Nginx如何与PHP、Python、Ruby和Node.js等常见的Web应用和语言环境协同…

【AI视野·今日CV 计算机视觉论文速览 第300期】Fri, 1 Mar 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 1 Mar 2024 Totally 114 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers DistriFusion: Distributed Parallel Inference for High-Resolution Diffusion Models Authors Muyang Li, Tianle Cai, J…

考研复试指南

1. 记住,复试的本质不是考试,而是一场自我展示。 考研复试并非简单的知识考察,更是一场展示自我能力和潜力的机会。除了学科知识,考官更关注你的综合素质、学术兴趣和未来发展规划。因此,要保持自信,用更全…

理疗美容按摩小程序有哪些功能

医疗、美容和按摩等行业是一个快速发展的领域,很多美容院和理疗中心都希望通过小程序来提升服务质量和用户体验。下面我们来看看一个理疗美容小程序可以具备哪些功能,并介绍如何使用这些功能。 1. **在线预约服务**:用户可以通过小程序预约理…

上个epoll服务端程序的一点点优化

两点优化: (1)SOCK_NONBLOCK设置非阻塞代替非阻塞函数。 (2)将监听listenfd 的判断放在了else if(evs[ii].events & (EPOLLIN | EPOLLPRI))下面,因为listenfd的事件一定是读事件。 // 演示采用epoll模…

docker commit构建镜像时环境变量不生效问题解决

描述 当使用 docker commit 命令提交容器镜像时,环境变量的配置并不会自动生效。 原因 这是因为 docker commit 命令只是将容器的当前状态保存为一个新的镜像,并不会修改容器的运行时配置。 甚至在容器修改profile配置文件后进行docker commit都不会…

详解自动化测试框架特点和原理

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程,一周学完让你面试通过率提高90%!(自动化测试) 今天捡一些比较典型的工具型自动化框架来介绍,主要围绕历史、特点和原理来讲解,至于使用教程…

文件上传之图片马

图片马介绍 图片马&#xff1a;就是在正常图片中插入木马。 图片马的制作 1.我们先创建php木马文件1.php&#xff0c;内容有以下两种方式&#xff1a; <?php eval($_POST[a]); ?> /* 常规一句话木马 */ <?php $aPD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8; $myfile…

MYSQL07高级_Hash结构、平衡二叉树、B树、B+树介绍

文章目录 ①. 全表遍历②. Hash结构③. 平衡二叉搜索树(AVL)④. B树⑤. B树⑥. 时间复杂度 选择的合理性 磁盘的I/O操作次数对索引的使用效率至关重要查找都是索引操作,一般来说索引非常大,尤其是关系型数据库,当数据量比较大的时候,索引的大小有可能几个G甚至更多,为了减少索引…

人工智能编程助手FittenCode和CodeGeex

人工智能编程助手FittenCode和CodeGeex 介绍FittenCode安装使用方法 CodeGeex安装使用方法 介绍 FittenCode和CodeGeex都是代码生成和完成工具&#xff0c;具有自动补充缺失的代码部分、代码翻译、自动生成注释等功能&#xff0c;可以显著提高开发者的工作效率。 FittenCode …

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机(完整图文详细步骤教程)

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机&#xff08;完整图文详细步骤教程&#xff09; 一、PcDos20001.PcDos2000简介2.PcDos2000下载 二、创建PcDos2000虚拟机1.新建虚拟机2.类型配置3.类型配置4.选择版本5.命名、存位置6.磁盘容量7.调整虚拟配置7.1 调整虚拟配…

Iceberg Changelog

01 Iceberg Changelog使用 0101 Flink使用 CREATE CATALOG hive_catalog WITH (typeiceberg,catalog-typehive,urithrift://xxxx:19083,clientimecol5,property-version1,warehousehdfs://nameservice/spark );use CATALOG hive_catalog&#xff1b;CREATE TABLE test2( id B…

pytest多重断言插件-pytest-assume

最近准备废弃之前用metersphere做的接口自动化&#xff0c;转战pytest了&#xff0c;先来分享下最近接触到的一个插件&#xff1a;pytest-assume。 在使用这个插件之前&#xff0c;如果一个用例里面有多个断言的话&#xff0c;前面的断言失败了&#xff0c;就不会去执行后面的断…

flutter打包命令

apk Build and release an Android app | FlutterHow to prepare for and release an Android app to the Play store.https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration flutter build apk --split-per-abi 如果不同cpu架构不打到同一个…

数组初始化(指定下标初始化)

在C语言中&#xff0c;在C99标准之后&#xff0c;就可以使用指定初始化器&#xff08;designated initializers&#xff09;来初始化数组或结构体中特定的元素。指定初始化器在初始化数组时允许显式地指定一个或多个索引及其相应的值&#xff0c;对于未显式初始化的元素&#x…

EI论文部分复现:含VSC-HVDC的交直流系统内点法最优潮流计算Simulink模型!

适用平台&#xff1a;MatlabSimulink&#xff1b;复现内容&#xff1a;VSC-HVDC模型 简介 高压直流传输系统主要包括换流站、输电线路和终端设备&#xff0c;其中换流站起着关键作用&#xff0c;他可以实现交流整流和直流逆变。常见的HVDC系统有全桥式、半桥式和两水平VSC等。…

C语言数组案例编程

1. 编写一个程序实现&#xff1a;从键盘输入15个整数存入数组&#xff0c;然后统计其中正整数的个数。 【要求】采用函数编程 #include<stdio.h> void input(int a[],int n) {int i; for(i0;i<n;i)scanf("%d",&a[i]); }int positiveNum(int a[],int n…

【Golang入门】简介与基本语法学习

概述&#xff1a; Golang&#xff0c;又称Go语言&#xff0c;是一种编译型、并发性强的编程语言&#xff0c;由Google公司的Robert Griesemer、Rob Pike及Ken Thompson于2007年开发。Go语言的设计初衷是为了解决多核处理器、网络系统和大规模代码库带来的开发困难。它提供了出色…