一尘不染

在Newtonsoft Json中使用TypeName处理警告

c#

链接的“备注”部分中提到:

TypeNameHandling当您的应用程序从外部源反序列化JSON时,应谨慎使用。SerializationBinder反序列化除以外的值时,应使用自定义验证传入的类型TypeNameHandling.None

在什么情况下,如果使用序列化/反序列化,来自外部来源的JSON会有害TypeNameHandling.All吗?一个工作示例将不胜感激。


阅读 281

收藏
2020-05-19

共1个答案

一尘不染

当使用TypeNameHandling.All和不使用SerializationBinder进行反序列化检查时,json.net会尝试创建一种类型的实例,该实例作为JSON中的元数据出现。

public class Car
{
    public string Maker { get; set; }
    public string Model { get; set; }
}

{
   "$type": "Car",
   "Maker": "Ford",
   "Model": "Explorer"
} //create a Car and set property values

但是攻击者可以向您发送代码或框架中存在的危险类型。

即从这里开始
System.CodeDom.Compiler.TempFileCollection是一个可序列化的类,其目的是维护由编译过程产生的临时文件列表,并在不再需要它们时将其删除。为了确保删除文件,该类实现了一个终结器,该终结器将在垃圾收集器清理对象时调用。攻击者将能够构造此类的序列化版本,该版本将其内部文件集合指向受害者系统上的任何文件。这将在反序列化后的某个时候删除,而无需反序列化应用程序的任何交互。

    [Serializable]
    public class TempFileCollection
    {
       private Hashtable files;
       // Other stuff...

       ~TempFileCollection()
       {
         if (KeepFiles) {return}
         foreach (string file in files.Keys)
         {
            File.Delete(file);
         }
       }
    }

   {
       "$type": "System.CodeDom.Compiler.TempFileCollection",
       "BasePath": "%SYSTEMDRIVE",
       "KeepFiles": "False",
       "TempDir": "%SYSTEMROOT%"
    } // or something like this, I just guessing but you got the idea
2020-05-19