是否可以将Json.Net设置为忽略$ type?

Geo*_*uer 6 c# json json.net

在json反序列化攻击中观看此视频,它显示了这一点json,可用于在任何反序列化它的应用程序上触发任意代码执行.

使用ObjectDataProvider执行任意代码

现在在我的应用程序中,我甚至从未使用过类型的json.我总是反序列化为动态对象或JObjects.在$type今天早上另一次无关的谈话之前,我甚至都不知道这个房产.

在我的json设置中是否有一种方法可以告诉它永远不会写或读取此属性?这不是我想要的东西.

dbc*_*dbc 9

"$type"信息仅在TypeNameHandling被修改为非默认值时写入TypeNameHandling.None- 这是默认值.如果您从未更改过该值, "$type"则不会发出信息.

类似的"$type"属性在反序列化时会被忽略TypeNameHandling = TypeNameHandling.None(这也是默认值),如文档中所述:

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

如果您的代码(或代码使用的类库)中的任何内容都没有修改TypeNameHandlingTypeNameHandling.None(通过设置或属性等JsonPropertyAttribute.TypeNameHandling)以外的其他内容,那么代码执行攻击就无法工作.(有关Json.NET的序列化程序的使用的更准确的细节,这些序列化程序不易受此攻击,请参阅AlvaroMuñoz和Oleksandr Mirosh的黑帽纸.

另请注意,如果使用JToken.Parse()(或某些类似的静态方法JObject.Parse())进行解析而不是反序列化,JsonSerializer.Deserialize<T>()"$type"属性的存在将导致此类属性填充到JToken层次结构中,因为JToken.Parse()从不调用序列化程序.如果仍然想要去除那些"$type"解析后的属性,你可以使用JsonExtensions.RemoveTypeMetadata(this JToken root)该用TypeNameHandling.All序列化反序列化的字符串来做到这一点.

如此说来,如果一个集合是由另一个应用程序中使用序列化TypeNameHandling.ArraysTypeNameHandling.All然后会出现在JSON嵌套了一层额外的.要在反序列化时去除它,请参阅IgnoreCollectionTypeConverter版本/格式之间迁移序列化Json.NET文档的策略,或者IgnoreArrayTypeConverterMake Json.NET中查看如果它不兼容则忽略$ 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
}
Run Code Online (Sandbox Code Playgroud)

然后JsonSerializerSettings按如下方式设置:

var settings = new JsonSerializerSettings
{
    SerializationBinder = new DisallowSerializationBindingBinder(),
};
Run Code Online (Sandbox Code Playgroud)

并修改全局设置,如设置默认全局json序列化程序设置(对于控制台应用程序),如何在MVC 4 Web API中为Json.NET设置自定义JsonSerializerSettings?(对于ASP.NET Web API)或JsonSerializerSettings和Asp.Net Core(对于asp.net核心).


归档时间:

查看次数:

1742 次

最近记录:

6 年,5 月 前