Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA5362 |
| Заголовок | потенциальный цикл ссылок в графе десериализованных объектов |
| Категория | Безопасность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Класс, помеченный атрибутом System.SerializableAttribute, содержит поле или свойство, которое может прямо или косвенно ссылаться на содержащий его объект, что может приводить к потенциальному циклу ссылок.
Описание правила
При десериализации недоверенных данных любой код, обрабатывающий десериализованный граф объекта, должен обрабатывать циклы ссылок без перехода в бесконечные циклы. Сюда входит код, который является частью обратного вызова десериализации, и код, обрабатывающий граф объекта после завершения десериализации. В противном случае злоумышленник может выполнить атаку типа "отказ в обслуживании" с вредоносными данными, содержащими цикл ссылок.
Это правило необязательно означает наличие уязвимости, но просто помечает потенциальные циклы ссылок в графах десериализованных объектов.
Устранение нарушений
Не следует сериализовать класс и удалять SerializableAttribute. Также можно переработать приложение таким образом, чтобы самоссылочные члены могли быть удалены из сериализуемого класса.
Когда лучше отключить предупреждения
Можно отключить вывод предупреждений для этого правила в следующих случаях:
- Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
- Весь код, обрабатывающий десериализованные данные, обнаруживает и обрабатывает циклы ссылок, не прибегая к бесконечному циклу или чрезмерному использованию ресурсов.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Примеры псевдокода
Потенциальное нарушение цикла ссылок
using System;
namespace ca5362
{
[Serializable]
class ExampleClass
{
public ExampleClass ExampleField;
public int NormalProperty { get; set; }
}
class AnotherClass
{
// The argument passed in could be
// `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while (ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleField;
}
}
}
}
Решение
[Serializable]
class ExampleClass
{
[NonSerialized]
public ExampleClass ExampleField;
public int NormalProperty { get; set; }
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while (ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleField;
}
}
}