
由于 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中文网其他相关文章!