Json.Net TypeNameHandling 设置为 Auto 会造成威胁吗?
在 JSON 反序列化中,Json.Net 的 TypeNameHandling 设置。网络在减轻潜在威胁方面发挥着至关重要的作用。但是,对于将此设置与用户提供的 JSON 数据一起使用的安全性仍然存在担忧。让我们深入研究这个问题,探讨潜在的风险和预防措施。
TypeNameHandling 的漏洞
外部 JSON 负载可以被操纵以包含指定的“$type”属性用于反序列化的类型。如果这些类型没有经过仔细验证,攻击者就可以利用它们来实例化称为“攻击小工具”的恶意对象。这些小工具可以执行恶意操作,例如远程代码执行 (RCE) 或文件系统操纵。
保护措施
Json.Net 已实施防护措施来防止此类攻击:
-
未知属性无知:它忽略未知属性,使具有无关“$type”属性的 JSON 有效负载无害。
-
序列化兼容性: 在多态值反序列化期间,它会检查解析的类型是否与预期类型匹配。如果没有,则会抛出异常。
潜在漏洞
尽管采取了这些措施,但在某些情况下仍然可能构建攻击小工具,即使在缺少明显的无类型成员:
-
无类型集合:反序列化未知类型的集合,例如 ArrayList、List
-
半类型集合:反序列化从 CollectionBase 派生的集合,支持运行时类型验证,可以为小工具创建窗口
-
共享基类型:声明为攻击小工具共享的接口或基类型的多态成员(例如 ICollection、IDisposable)可能会引入漏洞。
-
ISerialized 接口: 实现 ISerialized 的类型可能会无意中反序列化非类型化
-
条件序列化: 在 ShouldSerializeAttribute 中标记为非序列化的成员如果存在于 JSON 负载中,仍可能被反序列化。
建议
为了最大限度地降低风险,考虑以下建议:
-
验证未知类型:实现自定义 SerializationBinder 来检查传入的序列化类型并拒绝未经授权的类型。
-
避免无类型成员:确保您的数据模型不包含对象、动态或其他潜在可利用类型的成员类型。
-
设置 DefaultContractResolver: 考虑将 DefaultContractResolver.IgnoreSerializedInterface 和 DefaultContractResolver.IgnoreSerializedAttribute 设置为 true。
-
查看非序列化成员的代码: 验证该成员标记为非序列化在意外情况下不会被反序列化。
通过遵循这些最佳实践,您可以通过将 Json.Net TypeNameHandling 设置为 Auto 来大大降低外部 JSON 数据损害您的系统的可能性。
以上是您的 Json.Net `TypeNameHandling` 设置(自动)是否容易受到外部 JSON 数据攻击?的详细内容。更多信息请关注PHP中文网其他相关文章!