首页 > 后端开发 > C++ > 即使将反序列化限制为特定类型,使用 Json.Net 的'TypeNameHandling.Auto”自动 JSON 反序列化是否安全?

即使将反序列化限制为特定类型,使用 Json.Net 的'TypeNameHandling.Auto”自动 JSON 反序列化是否安全?

Mary-Kate Olsen
发布: 2025-01-07 14:16:41
原创
956 人浏览过

Is Automatic JSON Deserialization with Json.Net's `TypeNameHandling.Auto` Secure, Even When Limiting Deserialization to a Specific Type?

外部 JSON 会因为 Json.Net TypeNameHandling Auto 而变得脆弱吗?

问题:

在用户上传自定义 JSON 对象的网站应用程序中,必须意识到出现的潜在威胁来自自动 JSON 类型反序列化。问题是,如果反序列化的唯一类型是特定类型(例如 MyObject)并且 MyObject 的所有成员都不具有 System.Object 或动态类型,那么自动类型反序列化是否容易受到漏洞的影响。

答案:

虽然遵守这些条件可以显着降低风险,但并不能保证完全保护。 Json.Net 的 TypeNameHandling 设置为 Auto 时,即使 MyObject 中不存在相应字段,也有可能根据“$type”信息创建对象。

详细说明:

针对 Json.Net 的攻击利用 TypeNameHandling 设置来构造“攻击小工具”——旨在危害接收系统的对象。 Json.Net 的保护机制包括忽略未知属性和检查类型兼容性。然而,在某些情况下,即使没有任何明显的非类型化成员,也可以构造攻击小工具:

  • 非类型化集合的反序列化(例如 ArrayList、List
  • 半类型集合(例如, CollectionBase)
  • 实现 ISerialized 的类型的反序列化(例如 Exception)
  • 具有成员条件序列化的类型的反序列化(例如 public object tempData; public bool ShouldSerializeTempData() { return false; } })

建议:

  • 谨慎使用:反序列化外部 JSON 时应谨慎使用 TypeNameHandling,并且自定义SerializationBinder 推荐用于验证。
  • 检查数据模型:确保没有成员类型是对象、动态或与攻击小工具兼容。
  • 考虑序列化绑定器:实现自定义 SerializationBinder 来严格控制哪些类型

总之,虽然所提供的条件可以显着降低风险,但值得注意的是,它并不能保证完全的安全性。 Json.Net 的 TypeNameHandling Auto 设置仍然可能有利于攻击小工具的创建,因此需要采取额外的预防措施,例如自定义序列化绑定器。

以上是即使将反序列化限制为特定类型,使用 Json.Net 的'TypeNameHandling.Auto”自动 JSON 反序列化是否安全?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板