fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean,就是这么好用的软件竟然有问题!那fastjson有什么问题?下面来我们就来给大家讲解一下。
1.没有cve编号
Fastjson最为人诟病的一点是漏洞公开不规范。威胁情报和SCA(软件成分分析)的基础工作经常从跟踪CVE(CommonVulnerabilities&Exposures)漏洞编号开始,现在除了MITRE Corporation、CERT可以向研究人员和信息技术厂商分发CVE-ID编号,对有大量的用户基础而且且公司具备安全能力的软件厂商,如苹果、Adobe、Red Hat、、Github、VIVO等公司也是CANs成员,可以根据CVE-ID编号池分发漏洞编号。
2.序列化是会多字段,少字段;
3.有时不能序列化成功;
fastjson有漏洞原因是什么?
总体而言是一个叫做autoType的在搞事情。那么autoType是什么呢?
我们写一段简单代码演示一下:
public class JSONController { public static void main(String[] args) throws ParseException { Province province = new Province(); province.setProvincialCapital("wuhan"); province.setCityNum(12); Nation nation = new Nation(); nation.setName("傣族"); nation.setProvince(province); String nationStr = JSON.toJSONString(nation, SerializerFeature.WriteClassName); //{"@type":"com.xx.ins.qsm.demo.web.controller.Nation","name":"傣族","province":{"@type":"com.xx.ins.qsm.demo.web.controller.Province","cityNum":12,"provincialCapital":"wuhan"}} Nation nation1 = JSON.parseObject(nationStr, Nation.class); //{"name":"傣族","province":{"cityNum":12,"provincialCapital":"wuhan"}} Province province1 = (Province) nation1.getProvince(); //{"cityNum":12,"provincialCapital":"wuhan"} String nationStr2 = JSON.toJSONString(nation); //{"name":"傣族","province":{"cityNum":12,"provincialCapital":"wuhan"}} Nation nation2 = JSON.parseObject(nationStr2, Nation.class); //{"name":"傣族","province":{}} Province province2 = (Province) nation2.getProvince(); //Exception in thread "main" java.lang.ClassCastException: com.xxx.qsm.demo.web.controller.$Proxy0 cannot be cast to com.xxx.qsm.demo.web.controller.Province // at com.xxx.qsm.demo.web.controller.JSONController.main(JSONController.java:64) } } @Data class Nation { private String name; private Location province; } interface Location {} @Data class Province implements Location { private String provincialCapital; private Integer cityNum; }
可以看到:Nation类有一个属性province,其类型为接口Location,我们赋值的时候,是给它的实现类Province的对象。
接下来,2次序列化是否使用了SerializerFeature.WriteClassName。
使用了该属性的,序列化的json字符串就出现了一个@type的东西,这个指明了这个对象到时候反序列的时候指定的类型。那么这个@type就是前面所说的万恶之源autoType。在fastjson早期,这个是自动开启的。
那它有什么作用呢:就是反序列化的时候,可以指明我要的对象是什么。从代码可以看到,第二段序列化是没有@type的,所以它反序列化的时候,字段province根本没法转为本来的Province类型。如果指定了类型,那么就很容易的反序列化到指定的类。
fastjson有漏洞这是铁定的事实,不过开发人员在开发中遇到这样的问题也不要担心,我们只要进行safeMode的配置,在配置后将会完全禁用autoType就可以了。最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。
推荐阅读: