【发布时间】:2018-06-17 23:19:22
【问题描述】:
观看this video on json deserialization attacks,它显示了这段 json,可用于在任何反序列化它的应用程序上触发任意代码执行。
现在在我的应用程序中,我什至从不使用类型化的 json。我总是反序列化为动态对象或JObjects。我什至不知道$type 属性,直到今天早上另一个无关的谈话。
我的 json 设置中有没有办法告诉它永远不要写入或读取此属性?这不是我想要的。
【问题讨论】:
-
"$type"信息仅在TypeNameHandling修改为TypeNameHandling.None以外的其他值时写入 - 这是默认值。如果您从不更改该值,则永远不会省略"$type"信息。同样,"$type"属性在反序列化时被忽略TypeNameHandling = TypeNameHandling.None。 -
话虽如此,如果 collection 被另一个应用程序使用
TypeNameHandling.Arrays序列化,那么 JSON 中将会有额外的嵌套级别。要在反序列化时剥离它,请参见 Strategies for migrating serialized Json.NET document between versions/formats 中的IgnoreCollectionTypeConverter或 make Json.NET ignore $type if it's incompatible 中的IgnoreArrayTypeConverter。 -
最后,如果您正在使用在属性中设置
TypeNameHandling的 3rd 方库,您可以使用自定义合约解析器禁用它,如 How to disable TypeNameHandling when specified in attributes by using JsonSerializerSettings in Json.NET? 所示。 -
@dbc imo 你的 cmets 已经足够详尽了!
-
有关使用
TypeNameHandling时的其他安全风险示例,请参阅TypeNameHandling caution in Newtonsoft Json。