外部 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中文網其他相關文章!