V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanxasy
V2EX  ›  Java

fastjson 真就突出一个阴魂不散

  •  1
     
  •   fanxasy · 79 天前 · 10069 次点击
    这是一个创建于 79 天前的主题,其中的信息可能已经有所发展或是发生改变。
    接集团预警通报 2022 年第 13 号:监测发现,Java 开发组件 fastjson 存在反序列化漏洞。fastjson 被众多 java 软件作为组件集成,广泛存在于 java 应用的服务端代码中。攻击者可利用上述漏洞实施任意文件写入、服务端请求伪造等攻击行为,造成服务器权限被窃取、敏感信息泄漏等严重影响。此次事件影响 fastjson 1.2.80 及之前所有版本。目前,已发布 fastjson 最新版本 1.2.83 以修复该漏洞,组件升级地址为: https://github.com/alibaba/fastjson/releases/tag/1.2.83 。请各系统建设部门及时排查梳理受影响情况,在确保安全的前提下修复漏洞、消除隐患,提高网络系统安全防护能力,严防网络攻击事件。同时,加强安全监测,做好应急处置准备,发现突出情况要迅速处置并第一时间报告数据中心。
    97 条回复    2022-05-31 18:23:37 +08:00
    undef404
        1
    undef404  
       79 天前
    没用过 fastjson ,但是经常看到爆出漏洞的新闻。
    dcsuibian
        2
    dcsuibian  
       79 天前   ❤️ 1
    Spring Boot 默认 logback 和 Jackson ,真是 nice 。
    rekulas
        3
    rekulas  
       79 天前   ❤️ 1
    阿里巴巴:fastjson 现在负面有点多,这样吧咱们出个 fastjson2 重来 😜
    rekulas
        4
    rekulas  
       79 天前   ❤️ 1
    huihuiHK
        5
    huihuiHK  
       79 天前
    @rekulas 没想到还真有
    putaozhenhaochi
        6
    putaozhenhaochi  
       79 天前 via Android
    序列化库都这样
    fanxasy
        7
    fanxasy  
    OP
       79 天前
    我之前也想把项目从 fastjson 迁移到 spring 自带的 jackson 去,然而当我点开一个转换工具类,5 位数行代码里一片 jsonobject 、jsonarray ,我放弃了...
    Reficul
        8
    Reficul  
       79 天前
    > 又不是不能用.jpg
    tusj
        9
    tusj  
       79 天前
    bugest json
    NoKey
        10
    NoKey  
       79 天前
    问个问题,为啥不用 gson 呢?
    fwee
        11
    fwee  
       79 天前
    我就问你快不快吧,毕竟不叫 safejson
    sheeta
        12
    sheeta  
       79 天前   ❤️ 4
    其实我一直想不明白,JSON 这么重要的场景,Java 都没有一个官方的序列化的库吗,反而各种库横行( Jackson, FastJson, Gson 等等)。其他语言如 PHP, Go, Python 都是官方支持 JSON 解析的吧
    calano
        13
    calano  
       79 天前
    所以现在 fastjson2 能用了吗,依赖太多实在换不动
    xgfan
        14
    xgfan  
       79 天前   ❤️ 9
    开个地图炮,用着 spring 全家桶,还在用 fastjson 的,都是 sb 。
    LeegoYih
        15
    LeegoYih  
       79 天前   ❤️ 2
    个人几乎不用阿里开源框架 /工具
    Goooooos
        16
    Goooooos  
       79 天前
    @NoKey #10 Gson 性能一般,还是 Jackson 好
    chenshun00
        17
    chenshun00  
       79 天前
    @xgfan 不好意思,傻逼就是在下
    chendy
        18
    chendy  
       79 天前   ❤️ 3
    其实 jackson 之类的一样有漏洞,一样要升级( spring 全家桶的话跟着一起升级就行)
    只是 fastjson 作为阿里开源,相关消息关注度更高
    MakHoCheung
        19
    MakHoCheung  
       79 天前
    @sheeta 有官方(现在应该不算了)规范,JSON-P 和 JSON-B ,但是实现都在 Jakarta EE 容器里面。
    waising
        20
    waising  
       79 天前
    @calano #13 fastjson2 有个 2.0 版 还有个 2.0 兼容版
    cp19890714
        21
    cp19890714  
       79 天前
    我不能理解 “用 spring ,又特意改为 fastjson” 这种操作。
    AA5DE3F034ACCB9E
        22
    AA5DE3F034ACCB9E  
       79 天前
    @cp19890714 先入为主吧,像初学者搜索问下 Java 怎么处理 Json ,推荐的基本是 fastjson ,用习惯了 api 又怎么能轻易换
    moen
        23
    moen  
       79 天前
    阿里继续向外输出人才后估计又有更多公司要改成 Java ,按他们的习惯用上各种阿里的库(
    nothingistrue
        24
    nothingistrue  
       79 天前
    @sheeta #12 Java 有官方的序列化,因为安全漏洞实在难以修复,已经确定要被抛弃,只是因为替代品还没弄好一直没有正式抛弃。至于 JSON ,它属于类似 XML 那样的跨平台数据格式,原本不是为序列化 /反序列化服务的,即无法成为 Java 内部标准,也无法让 Java 为其提供 JDK 级别的实现,这点跟 XML 一样的待遇,很正常。
    Oktfolio
        25
    Oktfolio  
       79 天前
    @cp19890714 基本没人改 Spring MVC 的默认 JSON 序列化库吧......
    est
        26
    est  
       79 天前
    我觉得 java 不支持 json 主要是因为强类型吧。
    zoumouse
        27
    zoumouse  
       79 天前
    一般的序列化库都有问题,包括 Jackson ,可以看下这个 https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet
    不过貌似 Gson 没出过大问题
    nine
        28
    nine  
       79 天前
    Java 这么繁荣是有道理的,连个 JSON 解析库都做不好,大把的输出时间换工资啊。
    AlkTTT
        29
    AlkTTT  
       79 天前   ❤️ 3
    @cp19890714 组内大部分同事对阿里开源有蜜汁崇拜,fastjson ,easyexcel ,nacos 都在用,劝都劝不动
    Joker123456789
        30
    Joker123456789  
       79 天前
    @nine 原来在你的逻辑里, 越麻烦 就越流行啊? 真是万年一遇的天才。
    NoKey
        31
    NoKey  
       79 天前
    @Goooooos 谢谢回复,我搜了一下,也没找到 gson 性能差多少的资料,能找到的性能比较看起来那点性能差异对服务影响不大,除非是那种大量解大 json 任务的
    Joker123456789
        32
    Joker123456789  
       79 天前
    @cp19890714 没多少人特意改为吧? 接收参数,响应参数等 框架自带的功能 又没人动。 只是需要手工处理 json 的时候 采用 fastjson ,因为用起来方便,不需要自己写工具类。jackson 确实麻烦了一点点。 只是一点点。
    96XL
        33
    96XL  
       79 天前
    hutool 的 json 咋样
    cweijan
        34
    cweijan  
       79 天前
    @rekulas 我还以为你是抖机灵, 没想到还真有!
    nine
        35
    nine  
       79 天前
    @Joker123456789
    存在即合理,我是发现者,不是定义者。
    xgfan
        36
    xgfan  
       79 天前   ❤️ 1
    @Joker123456789 你这个就是 fastjson 使用者的典型例子。

    很多 fastjson 的使用者不知道,jackson 的 objectMapper 早就注入到 spring context 里了。
    直接用就好了,压根不存在“需要手工处理 json 的时候 采用 fastjson ,因为用起来方便,不需要自己写工具类”。
    fiveStarLaoliang
        37
    fiveStarLaoliang  
       79 天前
    看来学艺不精的不在少数,spring 全家桶稍微研究一下就知道 objectMapper 是现成的,直接拿来用就行了
    frisktale
        38
    frisktale  
       79 天前
    Buges
        39
    Buges  
       79 天前 via Android
    @sheeta 缺乏统一的标准,Java 也有注解,抄一下 serde 作业也是好的。
    DrJoseph
        40
    DrJoseph  
       79 天前   ❤️ 13
    记者:你有什么特长
    大爷:我心算很快
    记者:1+1 等于多少
    大爷:5
    记者:不对
    大爷:但我算的快
    NewTab12138
        41
    NewTab12138  
       79 天前
    建议离阿里的开源项目远一点
    ragnaroks
        42
    ragnaroks  
       79 天前
    @frisktale dotnet 新的内置(特指 system.text.json )其实就是收编了牛汤杰森
    elintwenty
        43
    elintwenty  
       79 天前
    @Joker123456789 gson 并不比 fastjson 难用,上手极快
    dqzcwxb
        44
    dqzcwxb  
       79 天前   ❤️ 3
    Fastjson 出 bug 就是国产垃圾
    Jackson 出 bug 就是难免出问题能理解
    dbpe
        45
    dbpe  
       79 天前
    @MakHoCheung jakarta 这玩意...我记得 base in jdk11 吧?
    hidemyself
        46
    hidemyself  
       79 天前
    v 站输出阿里也是政治正确吗。。

    Dubbo,Druid,Nacos,Sentinel,arthas 等等好像都是阿里的
    debuggeeker
        47
    debuggeeker  
       79 天前
    当一个漏洞公开声明的时候,已经没有利用价值了
    opengps
        48
    opengps  
       79 天前
    反过来想,其实那些“没有问题的库”,出问题风险更大
    pcmgr456
        49
    pcmgr456  
       79 天前 via Android
    @cp19890714 毕竟国内很多人觉得阿里开源的东西高级
    jim9606
        50
    jim9606  
       79 天前
    又是 AutoType 的问题。
    罪过就是功能太强大,功能一复杂就容易出漏洞。
    跟 Log4j 那个漏洞也是有一些相似,有多少人知道为啥一个日志库有动态 class 执行的功能呢。
    ivechan
        51
    ivechan  
       79 天前
    国外很多开源软件其实也有漏洞。。。大可平常心看待。
    ufan0
        52
    ufan0  
       79 天前
    早期确实坑爹,现在就平常心看待吧,出问题不可怕,怕的是解决不了以及解决效率。
    就这点看来,fastjson 还是优秀的。

    另外慎用 fastjson2 ,同事近期还给 fastjson2 提了兼容性 issue 已被确认。
    Oktfolio
        53
    Oktfolio  
       79 天前
    @xgfan
    @fiveStarLaoliang

    随便找个初中级都知道默认 ObjectMapper 注册到了 Spring Context 中,不要想当然。
    EarthChild
        54
    EarthChild  
       79 天前
    @DrJoseph #40 哈哈哈这句话是针对 #11 说的吗?哈哈哈
    @fwee #11
    EvanLuo42
        55
    EvanLuo42  
       79 天前 via iPhone
    @sheeta 内置的反序列化库也有洞的吧,前几天刚做到题
    zhleonix
        56
    zhleonix  
       78 天前
    @AA5DE3F034ACCB9E 的确,Fastjson 的 API 比较简单,jackson 麻烦。
    ychost
        57
    ychost  
       78 天前
    基本的序列化 /反序列化都有类似漏洞,关 authType 保平安,那玩意儿除了 RPC 之外,其它应用场景真的很少
    sprite82
        58
    sprite82  
       78 天前
    @xgfan #36 人家不是说了,要手写工具类,Jackson api 实在不好用,这也是 fastjson 流行的原因之一。而不是注入不注入的问题,哪怕不是注入的,写个单例也比定义个变量再用注解方便
    mikulch
        59
    mikulch  
       78 天前
    @Oktfolio 还真不知道。。。每次用的时候不用自己 new 出来?
    xgfan
        60
    xgfan  
       78 天前
    @sprite82 最常用的 encode/decode ,两者基本没区别
    ```
    objectMapper.writeValueAsString(car);
    JSON.toJSONString(car);
    objectMapper.readValue(json, Car.class);
    JSON.parseObject(jsonString, Car.class);
    ```
    xgfan
        61
    xgfan  
       78 天前
    至于使用静态 JSON.xxxx 方法好,还是注入好,这个涉及到个人偏好问题了。
    XhstormR02
        62
    XhstormR02  
       78 天前 via Android
    @xgfan 静态就不用 new 了,像 jackson 还要得自己 new ,小白说这可太复杂了,狗头保命。我站 boot ,boot 用啥我用啥
    HiShan
        63
    HiShan  
       78 天前   ❤️ 2
    请问在座的各位能写一个又快又安全的 JSON 库出来吗?又要用又要说别人垃圾漏洞多。还能扯到 Java 垃圾连个自带的 json 库都没有。。不能做一个有礼貌的伸手党吗?
    sprite82
        64
    sprite82  
       78 天前
    @xgfan writeValueAsString 和 toJSONString ,我觉得后者更直白些,我感觉不爽的是 Jackson 会抛异常,我要专门处理它,所以我一般会写个工具类,用 fastjson 的 api 名字来包一下 Jackson 。静态和注入,我觉得综合考虑还是静态更好,注入的话没法直接在静态方法中使用
    Bromine0x23
        65
    Bromine0x23  
       78 天前
    只能说对应大部分开发者来说易用性确实大于可扩展性。
    性能上的话,当下 fastjson1 对比 jackson 已经没优势了: https://github.com/fabienrenaud/java-json-benchmark
    locochen
        66
    locochen  
       78 天前
    这个标题, 有的那啥了.
    开源是好事, 选择使用, 就要有风险预期. 不然资深开发拿那么高工资, 是玩了.
    Naccl
        67
    Naccl  
       78 天前
    代码洁癖不能忍受自己的 spring 项目额外依赖个 fastjson
    Dregs2
        68
    Dregs2  
       78 天前 via Android
    vert.x 里对 jackson 的封装蛮好用的
    aragakiyuii
        69
    aragakiyuii  
       78 天前 via iPhone
    @AlkTTT 求问一下 easyexcel 有啥替代品吗😂
    leeg810312
        70
    leeg810312  
       78 天前 via Android
    .net 和 Java 都写,还是.net 好,json 序列化只有 2 个库,一个官方一个 Newtonsoft ,用到现在也没有听到哪个有重大漏洞。
    seepiner
        71
    seepiner  
       78 天前
    可以用这个封装 jackjson 的库
    <dependency>
    <groupId>com.seepine</groupId>
    <artifactId>json</artifactId>
    <version>0.0.2</version>
    </dependency>

    主要封装了个 J sonObject 以及提供成静态方法
    JsonObject jsonObject = Json.parseObj("jsonStr");
    ArrayNode arrayNode = Json.parseArray("jsonStr");
    Bean bean = Json.parse("jsonStr", Bean.class);
    String jsonStr = Json.toJson(bean);
    micean
        72
    micean  
       78 天前 via Android
    jackson 还是结合 kotlin 最好用
    xuanbg
        73
    xuanbg  
       78 天前
    说什么 jackjson 的 api 难用的,就不能自己简单封装几个静态方法么?再说,你们都用不到深拷贝和类型转换的么?
    willygeek007
        74
    willygeek007  
       78 天前
    Bugjson
    bthulu
        75
    bthulu  
       78 天前   ❤️ 2
    @xuanbg jackson 漏洞也没少啊。fastjson 国内用的多,尤其阿里用的多,国内好多黑灰产都在研究 fastjson 的漏洞,导致看起来 fastjson 的漏洞比 jackson 多不少。就跟 windows 上木马病毒比 linux 多一个道理,并不是 windows 不行,用的人多了,自然就有人来研究各种奇奇怪怪偏门的漏洞了,这反而证明了这个项目非常成功。
    AlkTTT
        76
    AlkTTT  
       78 天前
    @aragakiyuii 复杂的用原生 poi ,简单的用 hutool
    wupher
        77
    wupher  
       78 天前
    写开源软件还真就不是轻松的活
    ZeroDu
        78
    ZeroDu  
       78 天前
    有一说一:fastjson api 确实易用。不用各种处理异常; 还有 nacos 确实比其他注册中心 /配置中心好用多。一套搞定不折腾
    zhongjun96
        79
    zhongjun96  
       78 天前
    @xuanbg 特地试了一下,怎么解析下划线和驼峰两种形式的 json ?
    比如有些接口返回的 {"user_name":"aa"},有些接口{"userName":"aa"}。bean 字段 userName 。
    自己封装静态方法只能指定一种映射方式,支持了下划线驼峰就会不支持。
    bthulu
        80
    bthulu  
       78 天前
    @zhongjun96 类里额外加一个 void setUser_name(xxx)的方法
    mmdsun
        81
    mmdsun  
       78 天前 via iPhone
    阿里出品,必属()
    zhongjun96
        82
    zhongjun96  
       78 天前
    @bthulu 现在都直接 @Data 了。而且正常一个接口几十个字段,一个一个加 set 方法也很蠢啊。fastjson 就可以同时兼容下划线和驼峰
    blankmiss
        83
    blankmiss  
       77 天前
    @nine
    存在即合理的真实意思
    合理的东西是实在的东西,然后才是实在的东西是合理的
    xuanbg
        84
    xuanbg  
       77 天前
    @zhongjun96 可以在 userName 字段上用 @JsonProperty("user_name")注解来指定输入的 user_name 字段对应到 bean 字段 userName
    xuanbg
        85
    xuanbg  
       77 天前
    @zhongjun96 哦哦,同时支持只能加个 set 方法。。。但这似乎是代码规范化的问题吧?接口不应该有统一的数据规范么,连 key 的名称都不一样是什么鬼?是不是你还要兼容有人用 UserName ?
    zhongjun96
        86
    zhongjun96  
       77 天前
    @xuanbg #84 我只是举个例子。最基本的,对接多家第三方 api 的话,下划线和驼峰肯定都是有的。抽取成静态 api 的话就只能支持一种。不然就要手动加注解。实际用起来是不如 fastjson 的
    golangLover
        87
    golangLover  
       75 天前 via Android
    @dqzcwxb fj 的同一个问题出现几十次了。。。
    liian2019
        88
    liian2019  
       73 天前
    无脑喷的人多少没脑子的
    Joker123456789
        89
    Joker123456789  
       73 天前
    @xgfan 没有任何注解的实体类 也属于 context 吗? map 也属于吗?
    Joker123456789
        90
    Joker123456789  
       73 天前
    @xgfan jaskson 需要在类上 添加 @JsonIgnoreProperties(ignoreUnknown = true) 才比较保险,属不属于麻烦一点点 的范畴?

    还有,不用 spring 的时候,你拿出来显摆的那些知识点,还起作用吗?
    xgfan
        91
    xgfan  
       73 天前
    @Joker123456789 序列化 /反序列化的配置是可以配置在 objectMapper 上。
    我只会 Spring ,别的都不会,会让你开心一点吗?
    你接着(spring/jackson)+fastjson 混用吧。
    Joker123456789
        92
    Joker123456789  
       73 天前
    @xgfan 哦,原来还要配置一下啊,这又算不算 麻烦一点点的范畴呢? 一点点。

    我们争论的 焦点 在于 “一点点”。 没想到 一句 “不用 spring 的时候” 就能刺痛你, 你也是够敏感的。

    最后模仿你一下,你接着 光用 spring 吧。
    xgfan
        93
    xgfan  
       73 天前
    @Joker123456789 帮你捋一捋整个来龙去脉吧。
    #21 ,cp19890714 发言:`我不能理解 “用 spring ,又特意改为 fastjson” 这种操作。`
    #32 ,你表示“没多少人特意改为吧? 接收参数,响应参数等 框架自带的功能 又没人动。 只是需要手工处理 json 的时候 采用 fastjson ,因为用起来方便,不需要自己写工具类。jackson 确实麻烦了一点点。 只是一点点。”

    后续所有讨论,不都是用了 Spring 的基础上吗,你搁这儿跟我扯什么“不用 spring”呢?
    Joker123456789
        94
    Joker123456789  
       73 天前
    @xgfan 你还帮我 捋一捋???

    我:jackson 确实麻烦了一点点,只是一点点。
    你:根本就没

    接下来就好玩了,你接着说出了两个 “确实麻烦一点点的地方” 来证明 “他没有麻烦一点点”。

    1. jackson 的 objectMapper 早就注入到 spring context 里了。 我就问你,没有任何注解的实体类,map ,list 等 属于 context 吗??
    2. 序列化 /反序列化的配置是可以配置在 objectMapper 上。 需要配置一下 属于 麻烦一点点的范畴吗???

    你连 基本的逻辑都没捋清楚,还帮我捋一捋????
    xgfan
        95
    xgfan  
       73 天前
    @Joker123456789 在已经用了 Jackson 的前提下,再引入一个 fastjson 麻烦 ,还是继续使用统一的 jackson 麻烦。
    这个问题都要争论,我无话可说。
    Joker123456789
        96
    Joker123456789  
       73 天前
    @xgfan jackson 是 spring 依赖的,我本来就需要引入 spring ,所以 jackson 的引入对我没有增加任何工作量。

    我增加的工作量仅仅是 引入了一次 fastjson ,而且 一次性引入即可, 后面 我所提到的那些麻烦的点 就全都不存在了。

    你信仰 jackson ,就好好信仰吧,当你喜欢一件东西的时候,他在你眼里就是完美的。

    而我, 我自己写的框架里就是 jackson ,你不信的话可以去扒源码, 我是实实在在用过的人, 也是实实在在接纳了 jackson 的人, 不像你,带着偏见,在这批评一个你根本没接纳的东西。
    xgfan
        97
    xgfan  
       73 天前
    @Joker123456789 确实没啥工作量,只需要出问题之后修双份漏洞而已。
    别扣帽子,什么“显摆”、“信仰”、“偏见”。
    我有说 fastjson 不好吗?我只是在批评“在一个项目内引入两个 json 工具”这种行为而已。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2432 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 11:48 · PVG 19:48 · LAX 04:48 · JFK 07:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.