Newtonsoft.Json 序列化反序列化异常抛出及安全性问题咨询
问题A:类型不匹配时反序列化抛异常的配置方案
你遇到的返回Newtonsoft.Json.Linq.JObject的核心原因有两个,对应修改如下:
- 首先修正类型解析逻辑:你当前调用
Type.GetType(messageType)时,传入不存在的类型名会返回null,此时JsonConvert.DeserializeObject接收到null作为目标类型参数,默认会将JSON反序列化为JObject类型。只要给Type.GetType加上throwOnError: true参数,找不到对应类型时会直接抛出TypeLoadException,不会进入后续反序列化逻辑。 - 配置反序列化参数避免结构不匹配的静默返回:如果目标类型存在,但JSON结构和类型定义不匹配,要让反序列化抛出异常,需要新增
JsonSerializerSettings配置:
private object DeserializeMessage(string messageType, string messageSerializedData) { // 类型不存在时直接抛出异常,不返回null Type type = Type.GetType(messageType, throwOnError: true); var deserializeSettings = new JsonSerializerSettings { // 目标类型缺少JSON中对应的字段时抛出异常 MissingMemberHandling = MissingMemberHandling.Error }; return JsonConvert.DeserializeObject(messageSerializedData, type, deserializeSettings); }
如果需要严格校验类型一致性,可以额外在反序列化完成后判断返回对象的运行时类型是否和目标type一致,不一致直接抛出异常
问题B:现有代码的安全风险分析
你的现有代码当前不存在高危的不安全反序列化漏洞,但存在潜在风险点:
- 核心安全前提:Newtonsoft.Json的远程代码执行类反序列化漏洞,均要求开启
TypeNameHandling为非None的枚举值(该配置会读取JSON中携带的类型信息动态创建对象),你当前使用默认配置TypeNameHandling.None,反序列化只会使用你显式传入的type参数,不会读取JSON内的类型信息,因此不存在直接的RCE漏洞。 - 潜在风险点:如果
messageType参数的来源未做校验,攻击者可以传入系统内置危险类型的 AssemblyQualifiedName,反序列化时可能触发危险的构造逻辑、属性赋值逻辑。建议新增消息类型白名单校验,反序列化前验证解析得到的type属于业务允许的消息类型集合,不在白名单内直接拒绝执行反序列化。
内容的提问来源于stack exchange,提问作者Avihai Sudai
相关产品推荐
相关产品推荐

