fastjson有什么问题?fastjson有漏洞原因是什么?

阳光 2022-08-02 15:28:57 java常见问答 5286

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean,就是这么好用的软件竟然有问题!那fastjson有什么问题?下面来我们就来给大家讲解一下。

fastjson有什么问题.jpg

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工具网。

推荐阅读:

java线程池工作原理是什么?java如何实现一个线程池?

Java代码怎么打包?Java代码打包过程

json报表需要换行么?json如何转成excel?