在这个链接上,在备注部分提到了" TypeNameHandling".在什么情况下,如果使用序列化/反序列化来自外部源的JSON会有害SerializationBinder?一个工作的例子将不胜感激.
我正在运营一个小型网站,用户可以上传JSON中定义的自定义"对象".最近我了解了使用JSON进行自动类型反序列化的可能威胁:JSON问题.我想我理解了问题,但我必须要求确定.如果我只使用给定的特定类型(此处MyObject)反序列化传入的JSON,JsonConvert.DeserializeObject<MyObject>(json, settings);并且内部MyObject没有类型,并且没有类型的任何成员的子MyObject类型,System.Object或者dynamic没有什么可以变坏,对吧?
TypeNameHandling的settings设置为TypeNameHandling.Auto(我们不要质疑这个决定,它可能可以与工作None,但我想了解的问题将其设置为Auto.)
编辑:更多信息:我已经测试了前面提到的网站中的JSON:
{
"obj": {
"$type": "System.IO.FileInfo, System.IO.FileSystem",
"fileName": "rce-test.txt",
"IsReadOnly": true
}
}
Run Code Online (Sandbox Code Playgroud)
如果MyObject有一个System.Object或dynamic类型字段,obj我可以重现威胁.但是我想要知道的是:即使MyObject是一个非常复杂的对象,有很多(派生的)子对象,但是没有准备好的user-json我也是安全的,但是它们中没有一个是或者有一个System.Object或一个动态字段(也是不是喜欢的东西List<Object>)?例如,我可以想象,$type即使没有MyObject找到相应的字段,Json.NET 也会像创建对象那样做.
我想修改我的json.NET序列化程序,只将$ type属性添加到实现给定接口但不对任何属性或嵌套对象的对象.
使用TypeNameHandling.Auto(默认)
{
"PropertyA": 123,
"PropertyB": "foo",
"PropertyC": [1, 2, 3, 4]
}
Run Code Online (Sandbox Code Playgroud)
使用TypeNameHandling.All
{
"$type": "JsonNetTypeNameHandling.TestEvent, jsonNetTypeNameHandling",
"PropertyA": 123,
"PropertyB": "foo",
"PropertyC": {
"$type": "System.Collections.Generic.List`1[[System.Int32, mscorlib]], mscorlib",
"$values": [1, 2, 3, 4 ]
}
}
Run Code Online (Sandbox Code Playgroud)
我想要的是
{
"$type": "JsonNetTypeNameHandling.TestEvent, jsonNetTypeNameHandling",
"PropertyA": 123,
"PropertyB": "foo",
"PropertyC": [1, 2, 3, 4]
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用自定义的ContractResolver,但我没有让它工作:
class Program
{
static void Main(string[] args)
{
var serializerSettings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
ContractResolver = new EnableTypeNameHandlingAllOnlyForEvents(), …Run Code Online (Sandbox Code Playgroud)