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