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