使用FastJson将Json字符串解析为对象

一、介绍

近日,阿里云应急响应中心监测到fastjson爆发新的反序列化远程代码执行漏洞,黑客利用漏洞,可绕过autoType限制,直接远程执行任意命令攻击服务器,风险极大。

漏洞描述:

fastjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕过autoType限制,风险影响较大。阿里云应急响应中心提醒fastjson用户尽快采取安全措施阻止漏洞攻击。

影响版本

fastjson <=1.2.68
fastjson sec版本 <= sec9

安全版本

fastjson >=1.2.69
fastjson sec版本 >= sec10

二、依赖

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.73</version>
</dependency>

三、语法

对象转json JSON.toJSONString()

直接使用JSON.toJSONString()将对象解析成josn

json转对象 JSONObject.parseObject() JSONObject.parseArray()

假设一个Json字符串

{\"countAll\":0,\"tomcatport\":8081,\"countCorrect\":0,\"datatime\":\"6\",\"logid\":\"202008251616401404295157\",\"requestinfo\":\"{\\\"imei\\\":\\\"192016e9-3ab2-4849-8f41-d3a01c541ab0\\\",\\\"channelno\\\":\\\"221\\\",\\\"timestamp\\\":\\\"1598343399833\\\",\\\"subjectNum\\\":\\\"10000\\\"}\",\"requestip\":\"113.57.246.122\",\"requesttime\":\"2020-08-25 16:16:40\",\"requesttype\":\"63\",\"responsecode\":\"000000\",\"responseinfo\":\"{\\\"data\\\":[{\\\"address\\\":\\\"\\\",\\\"call\\\":\\\"\\\",\\\"classCode1\\\":\\\"\\\",\\\"classCode2\\\":\\\"511001\\\",\\\"classname1\\\":\\\"\\\",\\\"classname2\\\":\\\"运营商\\\",\\\"custId\\\":\\\"\\\",\\\"logo\\\":\\\"/icon/omc/1450424263860.png\\\",\\\"name\\\":\\\"中国电信\\\",\\\"type\\\":\\\"0\\\"}],\\\"errorCode\\\":\\\"000000\\\",\\\"flag\\\":false}\",\"userAgent\":\"TAS-AN00 Build/HUAWEITAS-AN00; 10\"}
 

我们要反序列化解析成对象,首先需要创建对象实体来接收。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
通过JSONObject.parseObject()JSONObject.parseArray()将字符串解析成对象或者是数组

			IogItemEntity iogItemEntity = JSONObject.parseObject(record.value(), IogItemEntity.class);
            Requestinfo requestinfo = JSONObject.parseObject(iogItemEntity.getRequestinfo(), Requestinfo.class);
            Responseinfo responseinfo = JSONObject.parseObject(iogItemEntity.getResponseinfo(), Responseinfo.class);
            List<DataEntity> dataEntities = JSONObject.parseArray(responseinfo.getData(), DataEntity.class);

3.2 将Json字符串解析为对象,不用新建实体接收!

{"msg":"success","code":"0000","page":{"totalRow":2,"pageNumber":1,"firstPage":true,"lastPage":false,"totalPage":2,"pageSize":1,"list":[{"templateType":"MY","templateCreater":"15037196928","outTemplateCode":null,"flag":0,"templateInfo":"DKHldTest2","cityCode":"000000","audit_date":null,"remark":null,"templateCode":"bst_template20210315171946157766","source":"DKH","type":null,"templateStatus":"0","deleteFlag":0,"operatorJT_time":null,"sourceCode":"15037196928","isSignatured":null,"id":10922,"auditer":null,"operatorP_time":null,"productType":"40","channelCode":"demoData","provinceCode":"000000","templateStatusJT":"0","updateTime":null,"auditerAccount":null,"createTime":"2021-03-15 17:19:47","deleteTime":null,"provinceAudit":"0","fail_reason":null,"templateStatusP":"1"}]}}

JSON结构:
在这里插入图片描述

//首先将Json用JsonObject接收下来
JSONObject jsonObject = JSON.parseObject(result);
//在使用JSONObject的get 获取key为page的value
JSONObject pageJsonOBJ = (JSONObject)jsonObject.get("page");
//因为list是一个json数组的形式,所以使用JsonObject的getJSONArray的方法来接收。
JSONArray list = pageJsonOBJ.getJSONArray("list");
String totalRow =(String) pageJsonOBJ.get("totalRow");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu_Shihao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值