首页 > 后端开发 > C++ > 如何使用 Json.Net 的 TypeNameHandling 保护来自外部源的 JSON 反序列化?

如何使用 Json.Net 的 TypeNameHandling 保护来自外部源的 JSON 反序列化?

Linda Hamilton
发布: 2025-01-07 14:12:40
原创
240 人浏览过

How Can I Secure My JSON Deserialization from External Sources Using Json.Net's TypeNameHandling?

由于 Json.Net TypeNameHandling Auto 导致的外部 JSON 漏洞

Json.Net 的 TypeNameHandling 自动设置在从不受信任的 JSON 反序列化时可能会引入安全风险来源。但是,可以通过遵守特定准则来减轻这些风险。

类型安全和攻击小工具

利用 TypeNameHandling 的攻击依赖于构建执行恶意操作的“攻击小工具”在实例化或初始化时。 Json.Net 通过验证反序列化类型与预期类型的​​兼容性来防范这些攻击。

漏洞条件

目标中没有显式对象或动态成员等级降低了风险,但并不能完全保证安全。在以下情况下可能会出现潜在的漏洞:

  • 非类型化集合:反序列化非类型化集合(例如 List)会为集合项中的攻击小工具留下空间。
  • CollectionBase 实现: CollectionBase 类型只能在运行时验证项目类型,从而创建潜在的漏洞窗口。
  • 共享基本类型/接口:与攻击小工具共享基本类型或接口的类型可以继承漏洞。
  • ISerialized 接口: 实现 ISerialized 的类型的反序列化可能允许非类型化成员反序列化。
  • 条件序列化: 使用 ShouldSerializeAttribute 方法标记的成员即使未显式序列化也可以反序列化。

降低风险

为了最大限度地降低风险,必须遵循这些建议:

  • 尽可能使用 TypeNameHandling.None。
  • 实现自定义 SerializationBinder 来验证传入类型并防止意外类型的反序列化。
  • 考虑忽略 [ Serialized] 属性,通过将 DefaultContractResolver.IgnoreSerializedAttribute 设置为true。
  • 确保所有不得反序列化的对象成员都使用返回 false 的 ShouldSerializeAttribute 方法进行标记。

通过遵守这些准则,即使在TypeNameHandling auto 的存在同时显着降低了攻击的风险。

以上是如何使用 Json.Net 的 TypeNameHandling 保护来自外部源的 JSON 反序列化?的详细内容。更多信息请关注PHP中文网其他相关文章!

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