fastjson升级版本遇到的问题

前面的话:

有关阿里的fastjson升级时遇到的问题,链接如下

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

我要说的,是我碰到这个问题时的一些处理

1、问题描述:

我所在的项目组是使用的微服务架构,我们组只负责我们自有模块,其他模块由其他团队负责,有一天,看到一条新闻说是fastjson修复了一些高危漏洞,然后我们就协定升版本,然后今天就踩到了这个坑,报错如下:

com.alibaba.fastjson.JSONException: unclosed.str

问题是这样的,我们原有代码转换的时候一个json字符串处理如下

String str = "{‘@type‘:‘com.dcf.platform.token.MessageHolder‘,‘forSend‘:‘211554‘,‘generateTime‘:1490422777204,‘id‘:‘18701762172‘,‘lastCanSendTime‘:1490422777204,‘message‘:‘211554‘}";

Object obj = JSON.parse(str);

当这个json字符串转化为object的时候,autotype被fastjson禁用掉了,导致异常

2、问题处理:

按照fastjson官网(就是最上面那个链接里)的说法,有几种处理方式,我们就临时先做了一个简单粗暴的处理,等到周一之后讨论具体方案(因为今天是周六)

做法就是按照官网说法,在tomcat的catalina.sh里面的JAVA_OPTS参数后面添加了JVM启动参数:-Dfastjson.parser.autoTypeSupport=true

这样子就不会报错了,不过这只是临时做法,因为这个是fastjson的安全漏洞,如果按照这种方式的话,也还是存在这样的漏洞的

3、另一种相对较好的解决方式:

添加配置项:fastjson.properties里面加入fastjson.parser.autoTypeAccept=com.serol.pojo

问题也可以解决,注意后面的包名是所要转换对象的包名,测试如下:

   Person person = new Person("明明", "aa", 21);
        final String valueStr = JSON.toJSONString(person, SerializerFeature.WriteClassName);
        System.out.println(valueStr);
        Object obj = JSON.parse(valueStr);
        System.out.println(((Person)obj).getUsername());

这个相对硬编码方式ParserConfig.getGlobalInstance().addAccept("com.serol.pojo");的好处是不用去修改原有代码,只需要添加这个配置,

相对于修改JVM启动参数的好处是,这个解禁autotype只针对所设置的这个包下的对象,其他的还是不可以转化

4、其他处理:

以上是针对已有代码,不愿意去大动干戈,那么如果新写的话,以怎样的方式更好一些呢?

我的做法是,转化时,需要传入所要转化对象的class

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.serol.pojo.Person;

main:  System.out.println(((Person)getJsonObject(Person.class)).getUsername());

public static Object getJsonObject(Class<?> clazz){
        Person person = new Person("明明", "aa", 21);//转化json,简单化处理
        String valueStr = JSON.toJSONString(person);//转化json,简单化处理
        System.out.println(valueStr);
        JSONObject obj = JSON.parseObject(valueStr);
        return JSONObject.toJavaObject(obj, clazz);
    }

这样的话,就完全不用担心那个安全问题了,避免autotype

有更好的方式请加评论,有问题,我们共同解决共同进步

时间: 2024-11-05 20:02:52

fastjson升级版本遇到的问题的相关文章

Python升级版本及版本升级后Yum无法使用的解决方法

#升级版本 yum -y install gcc cd /opt wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tgz tar xf Python-2.7.6.tgz  ./configure --prefix=/usr/local/python2.7  cd Python-2.7.6 ./configure --prefix=/usr/local/python2.7  make && make install mv /usr/b

NTFS For Mac升级版本方法介绍

在苹果市场发展快速的今天,Mac电脑在我们日常办公中必不可少,但是我们再使用Mac电脑时常出现与Windows系统文件不兼容的问题.这时NTFS For Mac就派上用场了. NTFS For Mac在Windows系统和Mac系统之间提供无阻碍的数据交换.现在它已经升级到NTFS For Mac12了,如何升级NTFS For Mac版本呢? 小编在这里告诉大家升级版本操作起来很简单,NTFS For Mac官网会不定期的推出新版本,系统会自动检查是否有新版本推出.如果一个新版本的驱动程序已被

斗地主牌型基本算法升级版本

斗地主牌型基本算法升级版本 好久没更新博客了,前段时间和朋友一起开了一个公司 做APP,最后失败了.现在又开始做棋牌游戏了,最近在看网狐的源码,发现里面斗地主的基本算法太强大了,现在想想我原来的算法简直是弱爆了,分享一下 希望能对你有一点点帮助.以下主要涉及到判断牌型,牌型大小比较2块,如果你想了解更多关于棋牌游戏的东西请访问我的 棋牌游戏专栏. 一.判断牌型 定义一个结构来表示每张相同牌的信息. //分析结构 structtagAnalyseResult { BYTE cbFourCount;

Nginx 升级版本或者重新编译增加参数

Nginx 升级版本或者重新编译增加参数 这里我们重新编译下,增加nginx用户和组 先创建用户 #useradd nginx 开始编译 #cd /usr/local/nginx-1.6.1 #./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --h

中国寒龙社工包v3.34 6.1升级版本已经发布 具体请到官网下载!!感谢支持!~~~~~不会升级的请到咱们交流群!本程序在windowsxp下最为兼容 感谢支持!如果有BUG请反馈!!

寒龙社会工程包:http://pan.baidu.com/s/1dDcilBb当你看到 中国寒龙V3.34 6.1版本的发布  那么本工具包将更强大的 展现了工具包的价值! 本次开发由by:寒龙升级  感谢大家支持 如果有各位小组的支持 本人不谢感激! 当然本站内的工具包 可以提供专门店小组工具包 制作!承接QQ群:94588528 本次手动升级  修复一下几点的不足! v3.33版本出现的  各种打不开的问题 v3.33版本中出现 主程序远控不能配置的问题 v3.33版本 部分 文件夹不能打开

SQLSERVER 升级版本的方法

1. 以SQLSERVER2014为例说明 SQLSERVER升级版本的方法, 也适用于evaluation 版本超过180天之后的处理. 2. 打开所有的应用 看到有一个 sqlserver2008的安装中心 还有一个 sqlserver 2014 的安装中心 这里显然 选择 sqlserver2014 的安装中心.(虽然是废话 但是我自己也点错过) 3. 选择维护  然后选择版本升级 稍等片刻 4.输入产品密钥 如果您是盗版受害者 可以输入一些序列号,这里随便从网上搜了一下: SQL SER

CentOS7升级版本

一.挂载本地yum源 1.将光盘中的内容scp到本地目录下,这里我的目录是/home/sda5/cdrom 2.修改配置文件,将本地源指向拷贝的目录 cd /etc/yum.repos.d/ mkdir -p /etc/yum.repos.d/backup mv * /etc/yum.repos.d/backup #将其他的yum源移到备份目录下,防止冲突 vim /etc/yum.repos.d/local.repo 1 [local] 2 name=local 3 baseurl=file:

python 2.6.6升级版本的详细操作步骤!

python2.6.6升级2.7.x 1.下载python2.7.x wget https://www.python.org/ftp/python/2.7.x/Python-2.7.x.tgz 2.解压并编译安装 tar -zxvf Python-2.7.x.tgz && cd Python-2.7.x && ./configure && make all && make install && make clean  &

Skyline从5.1升级版本到6.5的常见接口变化问题

1.原来Route对象升级成Presentation对象后,激活方法的变化: 原来5.1版本示例代码: function flyto(thisa) { var thisid = thisa.id; var thisb=IInformationTree.GetObjectEx(thisid,""); if(thisb.ObjectType=="21")//动态路径Route { thisb.Play(); } else { thisid=IInformationTre