簡體   English   中英

是否可以將Json.Net設置為忽略$ type?

[英]Is it possible to set Json.Net to ignore $type?

在json反序列化攻擊中觀看此視頻 ,它顯示了這一點json,可用於在任何反序列化它的應用程序上觸發任意代碼執行。

使用ObjectDataProvider執行任意代碼

現在在我的應用程序中,我甚至從未使用過類型的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.ArraysTypeNameHandling.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM