[英]Is it possible to set Json.Net to ignore $type?
在json反序列化攻擊中觀看此視頻 ,它顯示了這一點json,可用於在任何反序列化它的應用程序上觸發任意代碼執行。
現在在我的應用程序中,我甚至從未使用過類型的json。 我總是反序列化為動態對象或JObject
。 在今天早上另一個無關的對話之前,我甚至都不知道$type
屬性。
在我的json設置中是否有一種方法可以告訴它永遠不會寫或讀取此屬性? 這不是我想要的東西。
"$type"
信息僅在TypeNameHandling
被修改為TypeNameHandling.None
以外的其他內容時寫入 - 這是默認值 。 如果您從未更改過該值,則永遠不會發出"$type"
信息。
類似地,當TypeNameHandling = TypeNameHandling.None
(同樣是默認值)時,反序列化時會忽略"$type"
屬性,如文檔中所述:
// for security TypeNameHandling is required when deserializing
Stockholder newStockholder =
JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
如果沒有在你的代碼(或在代碼中使用類庫)不斷修改TypeNameHandling
比其他東西TypeNameHandling.None
(通過設置或屬性, JsonPropertyAttribute.TypeNameHandling
),那么代碼執行攻擊不能工作。 (有關Json.NET的序列化程序的使用的更准確的細節,這些序列化程序不易受此攻擊,請參閱AlvaroMuñoz和Oleksandr Mirosh的黑帽紙 。
另請注意,如果使用JToken.Parse()
(或某些類似的靜態方法,如JObject.Parse()
)進行語法分析而不是使用JsonSerializer.Deserialize<T>()
進行反序列化,那么"$type"
屬性的存在將只是因為JToken.Parse()
從不調用序列化程序,導致這些屬性被填充到JToken
層次結構中。 如果你想在解析后JsonExtensions.RemoveTypeMetadata(this JToken root)
那些"$type"
屬性,你可以使用來自用TypeNameHandling.All序列化的Deserialize字符串的 JsonExtensions.RemoveTypeMetadata(this JToken root)
來做到這一點。
話雖這么說,如果一個集合是由另一個使用TypeNameHandling.Arrays
或TypeNameHandling.All
應用程序序列化的,那么JSON中會有一個額外的嵌套級別。 要在反序列化時 IgnoreArrayTypeConverter
它,請參閱Strategies中的 IgnoreCollectionTypeConverter
, 以便在版本/格式之間遷移序列化的Json.NET文檔,或者從Make Json.NET中忽略 IgnoreArrayTypeConverter
, 如果它不兼容,則忽略$ type 。
最后,如果您正在使用在屬性中設置TypeNameHandling
第三方庫,則可以使用自定義合約解析程序禁用它,如在JSON.NET中使用JsonSerializerSettings在屬性中指定的如何禁用TypeNameHandling中所示? 。
如果您真的擔心團隊中的其他人可能啟用TypeNameHandling
,您可以創建一個自定義ISerializationBinder
,只要嘗試解析類型或類型名稱,就會拋出異常:
public class DisallowSerializationBindingBinder : ISerializationBinder
{
#region ISerializationBinder Members
public void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
throw new JsonSerializationException("Binding of subtypes has been disabled");
}
public Type BindToType(string assemblyName, string typeName)
{
throw new JsonSerializationException("Binding of subtypes has been disabled");
}
#endregion
}
然后在JsonSerializerSettings
設置它,如下所示:
var settings = new JsonSerializerSettings
{
SerializationBinder = new DisallowSerializationBindingBinder(),
};
並修改全局設置,如設置默認全局json序列化程序設置 (對於控制台應用程序), 如何在MVC 4 Web API中為Json.NET設置自定義JsonSerializerSettings? (對於ASP.NET Web API)或JsonSerializerSettings和Asp.Net Core (對於asp.net核心)。
不幸的是, TypeNameHandling.None
被忽略。 但你可以使用:
public static JsonSerializerSettings JsonSerializationSettings
= new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.