簡體   English   中英

全局設置庫參數 (Newtonsoft.Json MaxDepth)

[英]Setting Library Parameter Globally (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. 我們正在使用.Net 3.1,我們的 repo 似乎有大約 5 個入口點。

JsonConvert.DefaultSettings是一個public static Func<JsonSerializerSettings> ,所以你只需要在啟動時設置一次。

您有幾個選項可以做到這一點,這應該比在每個 class 構造函數中設置它更容易:

  1. 您注意到您的單體存儲庫有 5 個入口點,因此您可以在每個Program.cs中設置JsonConvert.DefaultSettings

  2. 如果您有一些 class 供您的整體存儲庫的所有消費者使用,您可以在 static 構造函數中為該 class 設置JsonConvert.DefaultSettings

     public class SomeUniversallyUsedClass { static SomeUniversallyUsedClass() { // add this line here JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 }; } // Remainder of the class }
  3. 你提到你正在使用 .NET 6 .NET 核心 3.1。 在 c# 9.0/.NET 5 及更高版本中,您可以使用模塊初始化程序為單體存儲庫中的每個模塊設置一次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 個入口點和/或常用類的 static 構造函數調用JsonNetModuleInitializer.Initialize()

    演示小提琴在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM