字符串转换成对象列表时候抛出异常:com.alibaba.fastjson.JSONException: TODO

问题描述:

前段时间公司提出要修复Fastjson1.2.80及以下版本, 代码执行漏洞,该漏洞允许攻击者绕过 Fastjson 中的"AutoTypeCheck"机制并实现远程代码执行这个漏洞,最简单的方法当然是升级Fastjson版本,但是升级版本之后出现了一系列新的问题,其中就包括这个,升级后的版本是2.0.0版本。


原因分析:

public static List parseArray(String text, Class clazz)方法是一个比较常用的方法,遇到问题的第一反应我没有怀疑jar包出现了问题,而是怀疑字符串里出现了某些特殊字符导致的出错,研究了好长一段时间,没有啥头绪,最后就只能看看源码了,看完源码之后我麻了呀。
以下是2.0.0版本这个方法的实现:
在这里插入图片描述
好家伙,我直接好家伙,直接没有实现。
顺便贴一下原先低版本1.2.32中此方法的实现
在这里插入图片描述


解决方案:

找到问题了,解决就相对简单了。
第一种解决方案就是不再调用此方法了,使用其他方法来达到我们的目的;
比如使用jsonlib里的方法来实现

JSONArray jsonArray = SONArray.fromObject(json);
for(int i=0;i<jsonArray.size();i++){
	JSONObject job = jsonArray.getJSONObject(i);
}

第二种就是自己写一个公共方法来替代jar包里的这个方法,工作量与第二种差不了多少;
附上低版本中的方法实现,给大家参考一下:

public static <T> List<T> parseArray(String text, Class<T> clazz) {
        if (text == null) {
            return null;
        }

        List<T> list;

        DefaultJSONParser parser = new DefaultJSONParser(text, ParserConfig.getGlobalInstance());
        JSONLexer lexer = parser.lexer;
        int token = lexer.token();
        if (token == JSONToken.NULL) {
            lexer.nextToken();
            list = null;
        } else if (token == JSONToken.EOF && lexer.isBlankInput()) {
            list = null;
        } else {
            list = new ArrayList<T>();
            parser.parseArray(clazz, list);

            parser.handleResovleTask(list);
        }

        parser.close();

        return list;
    }

第三种就是换jar包,简单快捷。文章来源地址https://uudwc.com/A/1zJq

原文地址:https://blog.csdn.net/weixin_43124438/article/details/126836792

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年06月17日 06:39
unityEditor扩展开发onGUI添加右键菜单
下一篇 2023年06月17日 06:39