0


字符串转换成对象列表时候抛出异常: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://blog.csdn.net/weixin_43124438/article/details/126836792
版权归原作者 Future守护 所有, 如有侵权,请联系我们删除。

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

还没有评论