CA2326:请勿使用 None 以外的 TypeNameHandling 值
属性 | 值 |
---|---|
规则 ID | CA2326 |
标题 | 请勿使用 None 以外的 TypeNameHandling 值 |
类别 | 安全性 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 否 |
原因
如果满足以下任一条件,则会触发此规则:
- 引用了
None
以外的 Newtonsoft.Json.TypeNameHandling 枚举值。 - 将表示非零值的整数值赋给 TypeNameHandling 变量。
规则说明
反序列化不受信任的数据时,会对不安全的反序列化程序造成风险。 攻击者可能会修改序列化数据,使其包含非预期类型,进而注入具有不良副作用的对象。 例如,针对不安全反序列化程序的攻击可以在基础操作系统上执行命令,通过网络进行通信,或删除文件。
此规则会查找 None
以外的 Newtonsoft.Json.TypeNameHandling 值。 如果仅希望在指定 Newtonsoft.Json.Serialization.ISerializationBinder 来限制反序列化类型时进行反序列化,请禁用此规则并启用规则 CA2327、CA2328、CA2329 和 CA2330。
如何解决冲突
- 如果可能,请使用 TypeNameHandling 的
None
值。 - 使序列化的数据免被篡改。 序列化后,对序列化的数据进行加密签名。 在反序列化之前,验证加密签名。 保护加密密钥不被泄露,并针对密钥轮换进行设计。
- 限制反序列化的类型。 实现自定义 Newtonsoft.Json.Serialization.ISerializationBinder。 在对 Json.NET 执行反序列化前,请确保在 Newtonsoft.Json.JsonSerializerSettings.SerializationBinder 属性中指定自定义 ISerializationBinder。 在已重写的 Newtonsoft.Json.Serialization.ISerializationBinder.BindToType 方法中,如果类型是非预期类型,会返回
null
或引发异常以停止反序列化。- 如果限制反序列化的类型,则可能需要禁用此规则并启用规则 CA2327、CA2328、CA2329 和 CA2330。 规则 CA2327、CA2328、CA2329 和 CA2330 有助于确保在使用
None
以外的 TypeNameHandling值时使用 ISerializationBinder。
- 如果限制反序列化的类型,则可能需要禁用此规则并启用规则 CA2327、CA2328、CA2329 和 CA2330。 规则 CA2327、CA2328、CA2329 和 CA2330 有助于确保在使用
何时禁止显示警告
在以下情况下,禁止显示此规则的警告是安全的:
- 已知输入为受信任输入。 考虑应用程序的信任边界和数据流可能会随时间发生变化。
- 你采取了如何修复冲突的某项预防措施。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#pragma warning disable CA2326
// The code that's violating the rule is on this line.
#pragma warning restore CA2326
若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none
。
[*.{cs,vb}]
dotnet_diagnostic.CA2326.severity = none
有关详细信息,请参阅如何禁止显示代码分析警告。
伪代码示例
冲突
using Newtonsoft.Json;
public class ExampleClass
{
public JsonSerializerSettings Settings { get; }
public ExampleClass()
{
Settings = new JsonSerializerSettings();
Settings.TypeNameHandling = TypeNameHandling.All; // CA2326 violation.
}
}
Imports Newtonsoft.Json
Public Class ExampleClass
Public ReadOnly Property Settings() As JsonSerializerSettings
Public Sub New()
Settings = New JsonSerializerSettings()
Settings.TypeNameHandling = TypeNameHandling.All ' CA2326 violation.
End Sub
End Class
解决方案
using Newtonsoft.Json;
public class ExampleClass
{
public JsonSerializerSettings Settings { get; }
public ExampleClass()
{
Settings = new JsonSerializerSettings();
// The default value of Settings.TypeNameHandling is TypeNameHandling.None.
}
}
Imports Newtonsoft.Json
Public Class ExampleClass
Public ReadOnly Property Settings() As JsonSerializerSettings
Public Sub New()
Settings = New JsonSerializerSettings()
' The default value of Settings.TypeNameHandling is TypeNameHandling.None.
End Sub
End Class
相关规则
CA2327:不要使用不安全的 JsonSerializerSettings
CA2328:确保 JsonSerializerSettings 是安全的