CA2326:請勿使用「無」以外的 TypeNameHandling 值
屬性 | 值 |
---|---|
規則識別碼 | CA2326 |
職稱 | 請勿使用「無」以外的 TypeNameHandling 值 |
類別 | 安全性 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 9 中啟用 | No |
原因
當符合下列任一條件時,就會引發此規則:
- 參考
None
以外的 Newtonsoft.Json.TypeNameHandling 列舉值。 - 代表非零值的整數值會指派給 TypeNameHandling 變數。
檔案描述
還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 例如,對不安全還原串行化程式的攻擊可能會在基礎操作系統上執行命令、透過網路通訊或刪除檔案。
此規則會 尋找以外的 Newtonsoft.Json.TypeNameHandling 值 None
。 如果只有在指定 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
例外狀況以停止還原串行化。
隱藏警告的時機
如果下列狀況,可以放心地隱藏此規則的警告:
- 您知道輸入是受信任的。 請考慮應用程式的信任界限和數據流可能會隨著時間而變更。
- 您已在如何修正違規中採取其中一項預防措施。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#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 安全