¿Es posible configurar Json.Net para ignorar $ tipo?

¿Es posible configurar Json.Net para ignorar $ tipo?

"$type" la información solo se escribe cuando TypeNameHandling se modifica a algo distinto de TypeNameHandling.None -- cuál es el predeterminado . Si nunca cambia el valor, "$type" la información nunca se emite.

Del mismo modo "$type" las propiedades se ignoran en la deserialización cuando TypeNameHandling = TypeNameHandling.None (que es, nuevamente, el valor predeterminado), como se indica en los documentos:

// for security TypeNameHandling is required when deserializing
Stockholder newStockholder =
  JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto
});

Si nada en su código (o en las bibliotecas de clases utilizadas por su código) modifica TypeNameHandling a algo que no sea TypeNameHandling.None (ya sea a través de configuraciones o atributos como JsonPropertyAttribute.TypeNameHandling ) entonces ese ataque de ejecución de código no puede funcionar. (Para obtener detalles más precisos sobre los usos del serializador de Json.NET que son y no son vulnerables a este ataque, consulte el artículo blackhat de Alvaro Muñoz y Oleksandr Mirosh.

También tenga en cuenta que, si está analizando con JToken.Parse() (o algún método estático similar como JObject.Parse() ) en lugar de deserializar con JsonSerializer.Deserialize<T>() entonces la presencia de "$type" properties simplemente dará como resultado que dichas propiedades se completen en el JToken jerarquía, ya que JToken.Parse() nunca invoca el serializador. Si, no obstante, desea eliminar esos "$type" propiedades después del análisis, puede usar JsonExtensions.RemoveTypeMetadata(this JToken root) from Deserializar cadena que fue serializada con TypeNameHandling.All para hacer precisamente eso.

Dicho esto, si una colección fue serializado por otra aplicación usando TypeNameHandling.Arrays o TypeNameHandling.All entonces habrá un nivel adicional de anidamiento en el JSON. Para eliminarlo al deserializar, consulte IgnoreCollectionTypeConverter de Estrategias para migrar documentos Json.NET serializados entre versiones/formatos o IgnoreArrayTypeConverter from Hacer que Json.NET ignore $type si es incompatible .

Finalmente, si está trabajando con una biblioteca de terceros que establece TypeNameHandling en los atributos, puede deshabilitarlo con un solucionador de contrato personalizado como se muestra en ¿Cómo deshabilitar TypeNameHandling cuando se especifica en atributos usando JsonSerializerSettings en Json.NET? .

Y si realmente le preocupa que alguien más en su equipo pueda habilitar TypeNameHandling , podría crear un ISerializationBinder personalizado que arroja una excepción cada vez que se intenta resolver un tipo o nombre de tipo:

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
}

Luego configúralo en JsonSerializerSettings de la siguiente manera:

var settings = new JsonSerializerSettings
{
    SerializationBinder = new DisallowSerializationBindingBinder(),
};

Y modifique la configuración globalmente como se muestra en Establecer la configuración predeterminada del serializador json global (para una aplicación de consola), ¿Cómo configurar JsonSerializerSettings personalizados para Json.NET en MVC 4 Web API? (para ASP.NET Web API) o JsonSerializerSettings y Asp.Net Core (para asp.net core).


Lamentablemente TypeNameHandling.None se ignora Pero puedes usar:

public static JsonSerializerSettings JsonSerializationSettings
        = new JsonSerializerSettings
{
    MetadataPropertyHandling = MetadataPropertyHandling.Ignore
};