[英]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
}
筆記:
我正在一個完整的存儲庫中工作,其中包含一堆解決方案,每個解決方案都包含多個項目。
由於某些外部依賴項,我們無法更新到 Json.NET 13.0.1。
我們正在使用.Net 3.1,我們的 repo 似乎有大約 5 個入口點。
JsonConvert.DefaultSettings
是一個public static Func<JsonSerializerSettings>
,所以你只需要在啟動時設置一次。
您有幾個選項可以做到這一點,這應該比在每個 class 構造函數中設置它更容易:
您注意到您的單體存儲庫有 5 個入口點,因此您可以在每個Program.cs
中設置JsonConvert.DefaultSettings
。
如果您有一些 class 供您的整體存儲庫的所有消費者使用,您可以在 static 構造函數中為該 class 設置JsonConvert.DefaultSettings
:
public class SomeUniversallyUsedClass { static SomeUniversallyUsedClass() { // add this line here JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 }; } // Remainder of the class }
你提到你正在使用 .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.