1、问题起因

  2017年3月15日,fastjson官方发布安全升级公告,该公告介绍fastjson在1.2.24及之前的版本存在代码执行漏洞,当恶意攻击者提交一个精心构造的序列化数据到服务端时,由于fastjson在反序列化时存在漏洞,可导致远程任意代码执行。 自1.2.25及之后的版本,禁用了部分autotype的功能,也就是”@type”这种指定类型的功能会被限制在一定范围内使用。而由于反序列化对象时,需要检查是否开启了autotype。所以如果反序列化检查时,autotype没有开启,就会报错。

2、问题产生的场景

  当调用 JSON.toJSONString(object, SerializerFeature.WriteClassName)后,得到的序列化字符串中,包含类的信息,即会含有一个“@Type”的键值对,描述类的信息。

  例如:"{\"@type\":\"com.zhi.fund.domain.Student\",\"age\":18,\"birthday\":-1594800000000,\"name\":\"\xe6\xb1\x89\xe5\x8d\xbf\",\"status\":true,\"stuId\":2}"

3、解决方式:

  参考:https://github.com/alibaba/fastjson/wiki/enable_autotype

4、FastJson的SerializerFeature属性整理

 

名称

含义

QuoteFieldNames

输出key时是否使用双引号,默认为true

UseSingleQuotes

使用单引号而不是双引号,默认为false

WriteMapNullValue

是否输出值为null的字段,默认为false

WriteEnumUsingToString

Enum输出name()或者original,默认为false

UseISO8601DateFormat

Date使用ISO8601格式输出,默认为false

WriteNullListAsEmpty

List字段如果为null,输出为[],而非null

WriteNullStringAsEmpty

字符类型字段如果为null,输出为”“,而非null

WriteNullNumberAsZero

数值字段如果为null,输出为0,而非null

WriteNullBooleanAsFalse

Boolean字段如果为null,输出为false,而非null

SkipTransientField

如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true

SortField

按字段名称排序后输出。默认为false

WriteTabAsSpecial

把\t做转义输出,默认为false

PrettyFormat

结果是否格式化,默认为false

WriteClassName

序列化时写入类型信息,默认为false。反序列化是需用到

DisableCircularReferenceDetect  

消除对同一对象循环引用的问题,默认为false

WriteSlashAsSpecial

对斜杠’/’进行转义

BrowserCompatible

将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false

WriteDateUseDateFormat

全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

DisableCheckSpecialChar

一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false

NotWriteRootClassName

含义

BeanToArray

将对象转为array输出

WriteNonStringKeyAsString

含义

NotWriteDefaultValue

含义

BrowserSecure

含义

IgnoreNonFieldGetter

含义

WriteEnumUsingName

含义