Newtonsoft.Json 与 System.Text.Json 多态反序列化的安全性差异解析

Newtonsoft.Json 与 System.Text.Json 多态反序列化的安全性差异解析

💡 原文中文,约5100字,阅读约需13分钟。
📝

内容提要

多态反序列化存在安全风险,特别是在使用 Newtonsoft.Json 时,可能导致类型注入攻击。微软 CA2326 规则建议避免不安全配置。System.Text.Json 通过显式声明派生类型来增强安全性,建议优先使用该库;若使用 Newtonsoft.Json,需严格验证类型合法性。

🎯

关键要点

  • 多态反序列化存在安全风险,尤其是使用 Newtonsoft.Json 时可能导致类型注入攻击。
  • 微软 CA2326 规则建议避免使用不安全的 JsonSerializerSettings 配置。
  • System.Text.Json 通过显式声明派生类型来增强安全性,建议优先使用该库。
  • Newtonsoft.Json 的 TypeNameHandling 配置项缺乏默认的类型校验机制,容易被攻击者利用。
  • System.Text.Json 默认不支持多态反序列化,需显式声明允许的派生类型,从机制上规避安全风险。
  • CA2326 规则警示禁止使用 TypeNameHandling 非 None 值的配置,以防止恶意 JSON 的注入。
  • 使用 SerializationBinder 可以降低 Newtonsoft.Json 的安全风险,通过白名单机制限制可反序列化的类型。
  • 在实际开发中,建议优先使用 System.Text.Json,若必须使用 Newtonsoft.Json,需严格校验类型合法性。

延伸问答

多态反序列化的安全风险是什么?

多态反序列化存在安全风险,尤其是使用 Newtonsoft.Json 时,可能导致类型注入攻击。

为什么建议优先使用 System.Text.Json?

System.Text.Json 通过显式声明派生类型来增强安全性,默认不支持多态反序列化,从机制上规避安全风险。

CA2326 规则的核心内容是什么?

CA2326 规则警示禁止使用 TypeNameHandling 非 None 值的配置,以防止恶意 JSON 的注入。

如何降低使用 Newtonsoft.Json 的安全风险?

可以使用 SerializationBinder,通过白名单机制限制可反序列化的类型,从而降低安全风险。

Newtonsoft.Json 的 TypeNameHandling 配置有什么问题?

TypeNameHandling 配置缺乏默认的类型校验机制,容易被攻击者利用,导致敏感类型实例化。

System.Text.Json 如何处理多态反序列化?

System.Text.Json 默认不支持多态反序列化,需通过 [JsonDerivedType] 特性或 DerivedTypes 显式声明允许的派生类型。

➡️

继续阅读