1.fastjson埋的源码「坑」,fastjson2.0能拯救吗?
2.Fastjson库parseObject/parseArray方法:表字段名和实体类属性的解析智能匹配研究(源码向)
3.002、Spring Boot返回Json数据及数据封装
4.教你如何用 IDEA 反编译 jar 源码解读
5.fastjson漏洞是源码否影响安卓
6.fastjson 1.2.24源码分析以及漏洞复现
fastjson埋的「坑」,fastjson2.0能拯救吗?
欢迎阅读,解析我是源码马建仓。
在数据交互中,解析觅行APP源码JSON因其跨语言、源码跨平台的解析特性而成为数据交换的首选。在Java领域,源码主流的解析JSON库包括三个:
快json的发展历程颇具传奇色彩。年,源码阿里巴巴资深技术专家温绍锦(花名:高铁),解析在搜索后发现缺少一款性能优秀的源码JSON解析库,于是解析开始开发一个高性能的解析器——快json,以满足阿里巴巴B2B平台技术部在应用监控系统Dragoon中的源码需求。自此,快json成为Java程序员广泛使用的国产类库。
然而,随着时间的推移,快json频繁曝出安全漏洞,一度成为网络热议的对象。年8月,高铁在阿里巴巴内网上公开回应争议。快json之所以频繁出错,部分原因在于其自动类型识别功能(AutoType)在年至年间进行了升级。
为了解决这些问题,高铁在4月底正式开源了快json v2,以全面升级和修复原有版本。如今,快json v2已通过Gitee官方推荐。开发者可通过访问项目地址,与作者直接交流或自行测试,以了解快json v2的性能提升。
快json v2的目标是为下一个十年提供高性能的JSON库。它与原始版本共享同一API体系,且已经解决了Auto Type RCE问题。
快json v2的性能提升体现在多个方面。在搭建测试环境和添加依赖时,用户需注意快json v2的GroupId与1.x版本不同,为com.alibaba.fastjson2。Maven依赖和Gradle依赖的格式已相应调整。此外,漫画app ios源码项目可根据实际需求选择不同的模块,如使用兼容包、fastjson-kotlin模块或fastjson-extension模块与SpringFramework等框架集成。
对于性能测试,用户应先搭建测试环境,添加对应依赖,再进行实际测试。在不同模块的源码获取方面,用户可直接访问项目仓库。针对快json v2的测试效果,用户可通过实际测试进行验证。如遇到疑问或发现BUG,用户可以直接在项目仓库与作者沟通。
Fastjson库parseObject/parseArray方法:表字段名和实体类属性的智能匹配研究(源码向)
项目中,数据来源从数据库转向HTTP请求获取JSON,面对无需mybatis映射的问题,团队成员产生了疑问:在未配置映射的情况下,实体类属性的驼峰命名与JSON键的任意书写为何能实现智能匹配?
深入分析Fastjson库源码,发现其确实具备智能匹配机制。以parseArray方法为例,首先解析JSON数据,其核心在于文本解析器lexer,它与智能匹配功能紧密相关。最终,解析流程导向JavaBeanDeserializer类中的parseField方法,此方法是智能匹配的关键所在。
进入parseField方法,可窥见其分段处理逻辑:首先通过TypeUtils工具类的fnv1a__lower和fnv1a__extract方法处理JSON键,通过哈希值比较实现初步匹配。fnv1a__extract通过去除下划线、短横线及大写字符,实现字符格式化处理,以适应常见的驼峰命名规则。
进一步深入,smartMatch方法在处理过程中,先通过fnv1a__lower进行大小写转换,再利用Arrays.binarySearch进行二分查找,以高效定位匹配项。当查找失败,即返回负值时,通过fnv1a__extract方法进一步去除下划线和短横线,linux源码下载+apt实现对标准命名规则的适应。
增加理解维度,smartMatch方法后续逻辑涉及对特定前缀如“is”的处理,允许在以“is”开头的键匹配时,跳过“is”部分进行匹配,确保JSON中的“isName”也能与数据表字段正确关联。
综上,Fastjson库在反序列化过程中,通过一系列逻辑处理实现对表字段名和实体类属性的智能匹配。具体步骤如下:
1. 首先,将JSON键转为小写,检查是否直接匹配表字段。若匹配,后续处理;若未匹配,继续下一步。
2. 然后,去除JSON键中的下划线和短横线,转为小写,再次检查与表字段的匹配情况。如匹配,后续处理;若未匹配且键以“is”开头,执行第三步。
3. 最终,对于以“is”开头的键,在去除“is”后再次尝试匹配,确保所有可能的匹配关系得到考虑。
、Spring Boot返回Json数据及数据封装
在项目开发中,接口与接口之间,前后端之间数据的传输都使用 Json 格式。Spring Boot 中,接口返回 Json 格式的数据很简单,在 Controller 中使用 @RestController 注解即可返回 Json 格式的数据。@RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解。默认情况下,使用 @RestController 注解即可将返回的数据结构转换成 Json 格式。Spring Boot 中默认使用的 Json 解析技术框架是 jackson。使用 @RestController 注解可以方便地返回 Json 数据。
Spring Boot 中对依赖都做了很好的封装。我们可以查看 pom.xml 中的 spring-boot-starter-web 依赖,可以看到一个 spring-boot-starter-json 依赖。酷知网源码Spring Boot 的特点之一是不需要人为去引入很多相关的依赖。我们可以再次点进去上面这个 spring-boot-starter-json 依赖,查看其内容。Spring Boot 中默认使用的 json 解析框架是 jackson。
在实际项目中,常用的数据结构无非有类对象、List 对象、Map 对象。默认的 jackson 框架对这三个常用的数据结构转成 json 后的格式如何?我们可以通过测试来验证。在 Controller 类中,我们可以分别返回 User 对象、List 和 Map。然后在浏览器中输入不同的 URL 来测试效果。我们看到,map 中不管是什么数据类型,都可以转成相应的 json 格式。这样就非常方便。
在实际项目中,我们难免会遇到一些 null 值出现。我们转 json 时,是不希望有这些 null 出现的。比如我们期望所有的 null 在转 json 时都变成 "" 这种空字符串。在 Spring Boot 中,我们可以通过配置来实现。我们可以新建一个 jackson 的配置类,修改返回 map 的接口,将几个值改成 null 进行测试。重启项目,再次输入 URL,可以看到 jackson 已经将所有 null 字段转成了空字符串了。
阿里巴巴的 FastJson 也常用于项目中 json 转换的相关工作。jackson 和 fastJson 的区别在于:上手难易程度、高级特性支持、官方文档、Example 支持和处理 json 速度。在扩展上,fastJson 没有 jackson 灵活,从速度或者上手难度来看,fastJson 可以考虑。在项目中使用的是阿里的 fastJson,挺方便的聊天购物app源码。使用 fastJson 需要导入依赖,版本为 1.2.。使用 fastJson 时,对 null 的处理和 jackson 有些不同。
为了在返回的 json 中添加一些其他信息,比如返回一些状态码 code 和返回一些 msg 给调用者,我们需要封装一个统一的 json 返回结构。这使得返回的 json 数据信息更加完整。我们定义了一个统一的 json 结构,包括数据、状态码、提示信息,并且可以根据实际业务需求做相应的添加。在 Controller 中,我们可以使用泛型来方便地返回各种数据类型。通过封装,我们不仅将数据通过 json 传给前端或者其他接口,还带上了状态码和提示信息。这在实际项目场景中应用非常广泛。
总结,本节详细分析了 Spring Boot 中 json 数据的返回。从默认的 jackson 框架到阿里巴巴的 fastJson 框架,我们对它们的配置进行了相应的讲解。另外,结合实际项目情况,我们总结了实际项目中使用的 json 封装结构体,加入了状态码和提示信息,使得返回的 json 数据信息更加完整。课程源代码下载地址:[课程源代码下载](链接)。
教你如何用 IDEA 反编译 jar 源码解读
要快速查看并解读 jar 包中的 class 源码,使用 IntelliJ IDEA (简称 IDEA) 是一个高效便捷的选择。只需几步操作,就能轻松反编译并阅读类源码。以下步骤指导你如何操作。
首先,确保你的本地 Maven 仓库已包含 jar 包。这里以阿里巴巴的 fastjson 包为例,其版本号为 1.2.。你可以在本地 .m2 仓库中找到并选择任意一个 jar 包。
接着,使用 WinRAR 或其他解压工具,将选中的 jar 包解压至当前文件夹中。解压后,你将看到一个名为 fastjson 的文件夹。
在解压出的 fastjson 文件夹内,寻找 JSON.class 文件。找到文件后,直接将鼠标拖拽至 IDEA 编辑器中即可。至此,你已成功反编译并打开了 jar 包中的源码。
这个方法简便高效,适用于快速查看和理解 jar 包内类的实现细节。通过这种方式,你不仅能更直观地了解代码逻辑,还有助于解决实际开发中遇到的问题。
来源:toutiao.com/i...
fastjson漏洞是否影响安卓
Fastjson存在已知的严重RCE漏洞,如CVE--和CVE--,通常影响服务器端的Spring Boot应用。然而,关于这些漏洞对安卓应用的影响,资料匮乏。分析显示,虽然fastjson的Android版本标注有漏洞,但官方公告表明Android环境不受CVE--的影响。
尽管fastjson出现过RCE漏洞,但它们的攻击原理相似,仅在安全检查方法上有所区别。以CVE--为例,尽管网上有相关信息,但安卓版fastjson为何不受影响尚无明确解释。安卓版fastjson是为安卓环境优化的,没有特殊改动,仅在版本号后缀表明其区别。
为了验证,我们进行了如下尝试:首先,在安卓上复现漏洞,但使用vulhub样本发现,由于样本依赖的jar文件无源码,需要从docker中获取并反编译。尝试使用spring boot工程搭建环境,结果表明,虽然理论上安卓版fastjson存在漏洞,但由于安卓不支持jndi,这使得现有的PoC在安卓上无法执行。
最终结论是,已知的fastjson漏洞对安卓应用影响有限,因为依赖的gadget如jndi在安卓中不可用。目前没有发现能在安卓环境下利用fastjson造成实际影响的gadget。普通版和Android版fastjson在服务器端的RCE漏洞是相同的,但在安卓环境下的安全特性使攻击不易实现。
fastjson 1.2.源码分析以及漏洞复现
反序列化,这个过程将字节序列恢复为Java对象。例如在使用Python做自动化测试时,通过字符串名字调用相同名字的方法。Fastjson的功能允许通过字符串引用如`@type":"com.sun.rowset.JdbcRowSetImpl`来执行内部方法。由此,我们能利用Fastjson提供的便利,通过调用对应的函数来验证漏洞。
在渗透测试中,漏洞的验证通常需要满足几个条件:判断指纹和指纹回显,Fastjson的特性使得这一步变得简单。然而,在利用过程中,要考虑到Fastjson本身的限制、JDK的限制以及可能的安全配置限制。因此,POC验证方案需考虑这些限制的版本和配置。
Fastjson通过JSON抽象类实现JSONAware接口,并提供两个常用方法:`toJSONString`用于对象转换为JsonString,`parseObject`用于将JSON字符串转换为对象。这次的漏洞主要与反序列化相关。
反序列化的执行发生在`DefaultJSONParser.java`类中。关键代码中,固定键`@type`对应反序列化类的全路径,其中`typeName`为传入类的全路径。在Fastjson 1.2.版本中,`loadClass`方法未进行任何过滤,允许传入任何JVM加载的类,并执行`setKey`方法,其中Key为可变参数。
要利用这个反序列化漏洞,需要满足以下条件:JVM加载的类、有非静态set方法和传入一个参数。使用RPC远程执行代码的思路实现POC,此处使用了`com.sun.rowset.JdbcRowSetImpl`实现。
JNDI全称为Java Naming and Directory Interface,主要提供应用程序资源命名与目录服务。其底层实现之一是RMI(Remote Method Invocation),用于Java环境的远程方法调用。在`com.sun.rowset.JdbcRowSetImpl`类中,关注点在于`getDataSourceName()`和`setAutoCommit()`方法。`getDataSourceName()`用于传值,`setAutoCommit()`用于确认调用set方法。
实现过程包括引用`com.sun.rowset.JdbcRowSetImpl`类、设置`dataSourceName`传值以及通过`autoCommit`属性触发执行方法。完成方法确认后,使用`marshalsec`项目启动RMI服务并加载远程类。
POC的实现步骤如下:首先确认目标是否使用Fastjson且存在漏洞;利用Fastjson的反序列化功能传输引用类和执行方法;使用`com.sun.rowset.JdbcRowSetImpl`执行验证POC的脚本,并观察回显结果;最后,完成漏洞利用。
具体操作包括搭建环境,如使用CentOS虚拟机作为RMI服务器和远程调用服务,KALI机器作为靶机和抓包测试。进行指纹确认、安装maven、构建RMI服务器和客户端、调用测试文件,并观察DNS日志以验证漏洞成功利用。通过DNS日志确认漏洞利用成功后,可以进一步尝试反弹shell,实现远程控制。
综上所述,Fastjson的反序列化漏洞是一个可以被利用的安全问题,通过合理的利用,可以实现远程代码执行。了解和研究这类漏洞有助于增强对Fastjson以及类似技术的防御能力。
fastjson的toJSONString()对于时间类的特殊处理源码分析——《DEEPNOVA开发者社区》
作者:贺子江
背景介绍
本文是在项目迭代过程中,针对fastjson库在时间类型处理上发现的一系列问题而进行的源码分析。通过案例分析和深入代码探索,揭示了fastjson对于时间类的特殊处理机制。
案例分析
在实际项目使用中,我们遇到了一个出乎意料的情况:对于Timestamp类型的toJSONString()方法调用,并没有按照预期输出Timestamp对象的toString信息,而是直接输出了时间戳的long值。经过复现问题并单独测试,我们明确了预期结果与实际输出之间的差异。
深入debug与代码分析
面对这一情况,首先产生了fastjson可能存在bug的初步怀疑。为了验证这一猜想,我们通过调用栈追踪,深入到fastjson的实现层。在序列化流程中,一个名为ObjectSerializer的接口被关键地调用。经过详细分析,我们发现Timestamp类型的序列化逻辑由DateCodec类负责。进一步追踪DateCodec的实现,我们发现了一系列if-else判断的逻辑,用于处理继承自Date类的类的序列化操作。关键在于,fastjson对于date类的实现有特殊的序列化策略,这需要特定的配置来实现正常的toJSONString功能。
解决方案研究
为了克服这一问题,我们提出了两个解决方案。第一,避免直接使用原生的日期类型,而是使用string形式进行表示,以确保输出符合预期。第二,配置fastjson的SerializerFeature,使用fastjson提供的类进行日期的特殊处理。
方案对比
通过实验验证,我们比较了两种方案的执行效率。第一种方案中,使用自定义的toString方法替代原生日期输出,执行时间约为ms。第二种方案下,通过配置SerializerFeature实现日期处理,执行时间约为ms。
结论
fastjson在处理时间类型方面,并没有展现出明显的优势。对于时间类型的打印,我们建议在业务层面对时间进行适当的转换和处理,以确保输出的格式既直观又易于控制。特别是时区的灵活处理,以及更严格的输出格式控制,能够提供更好的用户体验。当然,这仅是个人观点,欢迎不同意见的交流与讨论。
å»ç设å¤ç®¡çç³»ç»
å»ç设å¤ç®¡çç³»ç»æºç ï¼å»é¢å»ç设å¤ç®¡çç³»ç»æºç å è´¹å享使ç¨ææ¯ï¼Spring Bootï¼Apache Shiroï¼Thymeleafï¼MyBatisï¼
æ°æ®åºè¿æ¥æ± ï¼Druidï¼Fastjsonã
æ建ç¯å¢ï¼ideaãjava1.8ãmysql5.7 maven3
å»é¢ 设å¤ç®¡ç ç³»ç»æ¯å©ç¨è®¡ç®æºç¡¬ä»¶ã软件ãç½ç»è®¾å¤é信设å¤ä»¥åå ¶ä»åå ¬è®¾å¤ï¼è¿è¡è®¾å¤è¿è¡ä¿¡æ¯çæ¶éãä¼ è¾ãå å·¥ãå¨åãæ´æ°åç»´æ¤ï¼ä»¥æé«è®¾å¤å©ç¨æç为ç®çï¼æ¯æé«å±å³çãä¸å±æ§å¶ãåºå±è¿ä½çéæåçè®¾å¤ ä¿¡æ¯ç®¡çå¹³å° ã
ç³»ç»ä¸»è¦åè½ï¼ç»éï¼æ³¨åï¼ç³»ç»ç¨æ·ç®¡çï¼è§è²ï¼é¨é¨ç®¡çï¼è®¾å¤å¢å æ¹æ¥ã
ç³»ç»åè½ç®ä»ï¼
1ã ç³»ç»ç®¡çï¼ ç¨æ·ç®¡çãè§è²ç®¡çãèå管çãé¨é¨ç®¡çãå²ä½ç®¡çãåå ¸ç®¡çãåæ°è®¾ç½®ãéç¥å ¬åãæ¥å¿ç®¡ççã
2ã ç³»ç»çæ§ï¼å®æ¶çæ§è®¾å¤è¿è¡ãå¾ æºãè°è¯ãå ³æºãåæºçç¶æï¼è®°å½è®¾å¤æ£å¸¸å·¥ä½æ¶é´ã
3ã设å¤ç®¡çï¼è®¾å¤ä¿¡æ¯ç®¡çï¼å æ¬è®¾å¤å称ã设å¤ç¼å·ã设å¤ä»·æ ¼ã设å¤å家ãå家çµè¯ãæ¯å¦é«å¼ã设å¤ç¶æãè´ç½®æ¥æãå项ç¼è¾æä½çï¼
Java 巨坑系列:Java Bean 转 Map 的坑要注意!
本文主要讨论Java Bean转换为Map时可能遇到的两个主要问题:类型转换不一致和属性名解析错误。当使用fastjson将Java Bean转换为Map时,例如Long会被转化为Integer,Date变为Long,Double转为Decimal等。此外,BeanMap在处理某些场景时,key可能不与属性名完全匹配,尤其是通过get和set方法推断出的属性名。
Apache Commons BeanUtils的BeanMap在Maven版本中也存在类似问题。问题出在BeanInfo中的PropertyDescriptor.name,它依赖于java.beans.Introspector的getter方法解析。例如,getALong会被解析为ALong,getADouble为ADouble,这可能导致属性名解析错误。
使用cglib的BeanMap同样面临这个问题,因为其底层也使用了Introspector的decapitalize方法,进一步导致属性名不准确。为解决这些问题,本文介绍了一种基于Dubbo的解决方案,使用org.apache.dubbo.common.utils.PojoUtils进行转换,它能更准确地处理属性名,如getALong转换为ALong,而不会误解析为URL。
总结来说,Java Bean转Map的过程中,特别要注意类型匹配和属性名解析的正确性。在使用JSON框架和转换工具时,务必进行充分的测试和源码阅读,通过编写demo和调试来避免这些陷阱。对于特殊属性名,可能需要采取反射获取属性名和值的策略,并考虑缓存机制以提高效率。