外部 JSON 暴露:了解使用 Json.Net 进行 TypeNameHandling 的风险
使用自动类型处理的 JSON 反序列化可能会带来安全威胁。本文旨在阐明在 Json.Net 中使用 TypeNameHandling 并将设置设置为 Auto 时的潜在漏洞。
了解 Json.Net 中的 TypeNameHandling
TypeNameHandling 如何控制 JSON。 Net 反序列化具有“$type”属性的类型,该属性指定要实例化的类型的完全限定名称。当设置为 Auto 时,Json.Net 尝试解析指定类型并构造实例。
潜在危险
数据模型中没有直接对象或动态成员,您可以假设免受反序列化攻击。然而,某些场景仍然会带来风险:
-
非类型化集合:反序列化非类型化集合,如 ArrayList 或 List
-
CollectionBase:从 CollectionBase 继承的类型允许运行时项目验证,从而为攻击小工具构建创建潜在漏洞。
-
共享基本类型: 具有由攻击小工具共享的基本类型或接口的多态值很容易被反序列化
-
ISerialized 类型: 实现 ISerialized 的类型可能会反序列化非类型化成员,包括 Exception.Data 字典。
-
条件序列化: 标记为的成员如果它们存在于中,则仍然可以通过 ShouldSerialize 方法进行非序列化JSON 输入。
缓解措施
要增强安全性,请考虑以下事项:
-
自定义 SerializationBinder: 实现自定义 SerializationBinder 来验证预期类型并防止意外反序列化types.
-
TypeNameHandling.None:考虑将 TypeNameHandling 设置为 None,这会在反序列化期间有效禁用类型解析。
-
对意外/隐藏键入的警报: 对数据中的无类型成员或隐藏的序列化行为保持警惕model.
-
禁用默认序列化合约:避免将 DefaultContractResolver.IgnoreSerializedInterface 或 DefaultContractResolver.IgnoreSerializedAttribute 设置为 false。
结论
虽然 Json.Net 中的某些机制有助于缓解漏洞,但仔细考虑外部 JSON 反序列化中 TypeNameHandling 带来的潜在风险至关重要。通过遵循建议的预防措施,例如实现自定义 SerializationBinder 并验证数据模型的类型,您可以在利用 Json.Net 功能的同时提高应用程序的安全性。
以上是使用 Json.Net 的 TypeNameHandling 进行 JSON 反序列化有多安全?的详细内容。更多信息请关注PHP中文网其他相关文章!