如何全局设置Newtonsoft.Json的MaxDepth参数以修复漏洞?
解决方案:全局统一配置Newtonsoft.Json避免重复代码
针对你的场景(.NET 3.1、多入口点、无法升级Json.NET版本),不需要在每个依赖类的构造函数中重复设置,以下是几种简洁的实现方式:
1. 入口点一次性全局设置
JsonConvert.DefaultSettings是全局静态委托,一旦设置后,所有通过JsonConvert调用的序列化/反序列化操作都会自动使用该配置。你只需要在每个项目的入口点执行一次设置即可:
- 控制台/桌面应用:在
Main方法开头添加代码:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 }; - ASP.NET Core Web项目:在
Startup.cs的ConfigureServices或Configure方法中添加上述代码;同时如果项目使用Mvc的Newtonsoft序列化,还需要补充Mvc配置(避免Mvc单独使用默认配置):services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.MaxDepth = 128; });
你的仓库有5个入口点,每个入口点只需要添加1-2行代码,完全避免重复。
2. 封装静态初始化类(统一管理配置)
如果担心多个入口点漏配置,可以把初始化逻辑封装到一个公共静态类中,放在所有项目都能引用的公共项目里:
public static class JsonSecuritySettings { static JsonSecuritySettings() { // 全局设置MaxDepth JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 }; } // 触发静态构造函数的方法 public static void ApplySettings() { } }
然后在每个入口点调用一次:
JsonSecuritySettings.ApplySettings();
这种方式把配置逻辑集中管理,后续如果需要调整其他序列化参数,只需要修改这个类即可。
验证配置生效
设置完成后,可以通过反序列化一个超过128层的嵌套对象来验证:如果抛出JsonReaderException(提示超出最大深度),说明配置生效,漏洞修复完成。
内容的提问来源于stack exchange,提问作者Finesagan
相关产品推荐
相关产品推荐

