①使用mapper去设置FAIL_ON_UNKNOWN_PROPERTIES为false,不转换不知道的字段
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
②在要转换的Javabean上加上注解
@JsonIgnoreProperties(ignoreUnknown = true)
该注解还可以忽略指定字段,例如:
@JsonIgnoreProperties({ "internalId", "secretKey" })
忽略为null的字段的两种做法
注解
@JsonInclude(Include.NON_NULL)
通过ObjectMapper设置
new ObjectMapper().setSerializationInclusion(Include.NON_NULL);
分割线下请忽略
在公司开发系统时使用了FastJson来转换对象和json字符串,版本为1.1.43,在一段时间后发现报错,上网一查发现阿里发布了最新公告:
公告引用如下:
安全公告20200601
近日,阿里云应急响应中心监测到fastjson爆发新的反序列化远程代码执行漏洞,黑客利用漏洞,可绕过autoType限制,直接远程执行任意命令攻击服务器,风险极大。
漏洞描述
fastjson采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化Gadgets类时,在autoType关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕过autoType限制,风险影响较大。阿里云应急响应中心提醒fastjson用户尽快采取安全措施阻止漏洞攻击。
影响版本
fastjson <=1.2.68
fastjson sec版本 <= sec9
android版本不受此漏洞影响
这时发现我们的版本正是受波及的版本,现在面临的有两个选择
①将现有fastjson版本改至不受影响的版本;
②寻找替代品并更换fastjson。
考虑到即使升级版本以后也可能受到影响,所以选择用支持更多自主配置化的JackSon,以下就是在替换过程中遇到的一个问题。
无论是使用JackSon还是FastJson,无非是用来转换JSON字符串为对象或者转换对象为JSON字符串,但是我们使用JSON转对象的时候往往JSON数据不是那么规范,存在以下几种情况:
①JSON中有的字段在JavaBean中没有该属性
②JSON中字段值有的为null,有的又是空字符串 “”
在这次替换过程中就遇到了JSON中有的字段在JavaBean中不存在
代码如下
public static AppUser getBody(String token) {
String accessToken = token;
if(token.startsWith(PREFIX)) {
accessToken= token.replace(PREFIX, "");
}
try {
Claims claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(accessToken)
.getBody();
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(mapper.writeValueAsString(claims), AppUser.class);
// return JSON.parseObject(JSON.toJSONString(claims),AppUser.class);
} catch (Exception e) {
return null;
}
}
注释掉的代码为原来使用FastJson的代码,Claims是jwt包中的
有以下两种解决方式
①使用mapper去设置FAIL_ON_UNKNOWN_PROPERTIES为false,不转换不知道的字段
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
②在要转换的Javabean上加上注解
@JsonIgnoreProperties(ignoreUnknown = true)
该注解还可以忽略指定字段,例如:
@JsonIgnoreProperties({ "internalId", "secretKey" })
忽略为null的字段的两种做法
注解
@JsonInclude(Include.NON_NULL)
通过ObjectMapper设置
new ObjectMapper().setSerializationInclusion(Include.NON_NULL);