我正在尝试升级一个单片回购,使其不再受此NewtonsSoft的影响。Json Exploit。我是C#的新手,所以也许这就是为什么我在理解修复程序时有点困难的原因。他们说
这可以通过以下声明在全球范围内完成:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 };
我想我可以在每个依赖Newtonsoft的类构造函数中设置这一点,但这会产生大量重复(下面的示例(。我是不是完全疯了,有没有更干净的做事方式?
using Newtonsoft.Json
private class MyClasss
{
public MyClass()
{
// add this line here
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 };
// other steps
}
// other methods
}
注:
我在一个整体式回购中工作,其中包含一堆解决方案,每个解决方案都包含多个项目。
我们无法更新到Json。NET 13.0.1,因为存在一些外部依赖关系。
我们正在使用。净3.1,我们的回购似乎有大约5个入口点。
JsonConvert.DefaultSettings
是public static Func<JsonSerializerSettings>
,所以您只需要在启动时设置一次。
你有几个选项可以做到这一点,这应该比在每个类构造函数中设置它更容易:
-
您注意到您的单片回购有5个入口点,因此您可以在每个
Program.cs
中设置JsonConvert.DefaultSettings
。 -
如果你有一个类被你的整体回购的所有消费者使用,你可以在该类的静态构造函数中设置
JsonConvert.DefaultSettings
:public class SomeUniversallyUsedClass { static SomeUniversallyUsedClass() { // add this line here JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 }; } // Remainder of the class }
-
您提到您正在使用
JsonConvert.DefaultSettings
,如下所示:
internal class JsonNetModuleInitializer
{
[System.Runtime.CompilerServices.ModuleInitializer]
public static void Initialize()
{
// add this line here
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 };
}
}
如果您使用的版本早于。NET 5中,您仍然可以引入JsonNetModuleInitializer
并从您的5个入口点和/或常用类的静态构造函数中调用JsonNetModuleInitializer.Initialize()
。
在这里演示小提琴。