全局设置库参数(Newtonsoft.Json MaxDepth)



我正在尝试升级一个单片回购,使其不再受此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
}

注:

  1. 我在一个整体式回购中工作,其中包含一堆解决方案,每个解决方案都包含多个项目。

  2. 我们无法更新到Json。NET 13.0.1,因为存在一些外部依赖关系。

  3. 我们正在使用。净3.1,我们的回购似乎有大约5个入口点。

JsonConvert.DefaultSettingspublic static Func<JsonSerializerSettings>,所以您只需要在启动时设置一次。

你有几个选项可以做到这一点,这应该比在每个类构造函数中设置它更容易:

  1. 您注意到您的单片回购有5个入口点,因此您可以在每个Program.cs中设置JsonConvert.DefaultSettings

  2. 如果你有一个类被你的整体回购的所有消费者使用,你可以在该类的静态构造函数中设置JsonConvert.DefaultSettings

    public class SomeUniversallyUsedClass
    {
    static SomeUniversallyUsedClass()
    {
    // add this line here
    JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 };
    }
    // Remainder of the class
    }
    
  3. 您提到您正在使用

  4. 。NET 6。NET核心3.1。在c#9.0/.NET5及更高版本中,您可以使用模块初始化器为单片回购中的每个模块设置一次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()

    在这里演示小提琴。

相关内容

  • 没有找到相关文章