CA2326: не используйте значения TypeNameHandling, отличные от None
Свойство | Значение |
---|---|
Идентификатор правила | CA2326 |
Заголовок | Не используйте значения TypeNameHandling, отличные от None |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Это правило возникает при выполнении любого из следующих условий:
- Ссылка на значение перечисления Newtonsoft.Json.TypeNameHandling, отличное от
None
. - Переменной TypeNameHandling присваивается целочисленное значение, представляющее ненулевое значение.
Описание правила
Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. Атака против небезопасного десериализатора может, например, выполнять команды в базовой операционной системе, отсылать сообщения по сети или удалять файлы.
Это правило находит значения Newtonsoft.Json.TypeNameHandling, отличные от None
. Если вы хотите выполнить десериализацию, только если указан Newtonsoft.Json.Serialization.ISerializationBinder для ограничения десериализованных типов, отключите это правило и включите вместо него правила CA2327, CA2328, CA2329 и CA2330.
Устранение нарушений
- По возможности используйте для параметра TypeNameHandling значение
None
. - Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.
- Ограничьте десериализованные типы. Реализуйте пользовательский интерфейс Newtonsoft.Json.Serialization.ISerializationBinder. Перед десериализацией с помощью Json.NET убедитесь, что пользовательский интерфейс ISerializationBinder указан в свойстве Newtonsoft.Json.JsonSerializerSettings.SerializationBinder. Если в переопределенном методе Newtonsoft.Json.Serialization.ISerializationBinder.BindToType тип является непредвиденным, возвращается
null
или вызывается исключение для остановки десериализации.- При ограничении десериализованных типов может потребоваться отключить это правило и включить правила CA2327, CA2328, CA2329 и CA2330. Правила CA2327, CA2328, CA2329 и CA2330 помогают обеспечить использование ISerializationBinder при использовании значений TypeNameHandling, отличных от
None
.
- При ограничении десериализованных типов может потребоваться отключить это правило и включить правила CA2327, CA2328, CA2329 и CA2330. Правила CA2327, CA2328, CA2329 и CA2330 помогают обеспечить использование ISerializationBinder при использовании значений TypeNameHandling, отличных от
Когда лучше отключить предупреждения
Можно отключить вывод предупреждений для этого правила в следующих случаях:
- Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
- Вы выполнили одну из мер предосторожности из раздела Устранение нарушений.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#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
CA2329: не десериализировать с помощью JsonSerializer с помощью небезопасной конфигурации
CA2330: убедитесь, что JsonSerializer имеет безопасную конфигурацию при десериализации