CA2326: не используйте значения TypeNameHandling, отличные от None

Свойство Значение
Идентификатор правила CA2326
Заголовок Не используйте значения TypeNameHandling, отличные от None
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 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.

Когда лучше отключить предупреждения

Можно отключить вывод предупреждений для этого правила в следующих случаях:

  • Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
  • Вы выполнили одну из мер предосторожности из раздела Устранение нарушений.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#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: не используйте небезопасный jsonSerializer Параметры

CA2328: убедитесь, что jsonSerializer Параметры защищены

CA2329: не десериализировать с помощью JsonSerializer с помощью небезопасной конфигурации

CA2330: убедитесь, что JsonSerializer имеет безопасную конфигурацию при десериализации