CA2353: небезопасный набор данных или DataTable в сериализуемом типе
Свойство | Значение |
---|---|
Идентификатор правила | CA2353 |
Заголовок | Ненадежные данные DataSet или DataTable в сериализуемом типе |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Класс или структура, помеченная атрибутом сериализации XML или атрибутом контракта данных, содержит поле или свойство DataSet или DataTable.
Атрибуты сериализации XML включают:
- XmlAnyAttributeAttribute
- XmlAnyElementAttribute
- XmlArrayAttribute
- XmlArrayItemAttribute
- XmlChoiceIdentifierAttribute
- XmlElementAttribute
- XmlEnumAttribute
- XmlIgnoreAttribute
- XmlIncludeAttribute
- XmlRootAttribute
- XmlTextAttribute
- XmlTypeAttribute
Атрибуты сериализации контракта данных включают:
Описание правила
В случае десериализации ненадежных входных данных и если граф десериализованных объектов содержит DataSet или DataTable, злоумышленник может создавать вредоносные данные для проведения атаки типа "отказ в обслуживании". Могут существовать неизвестные уязвимости удаленного выполнения кода.
Это правило находит типы, которые становятся небезопасными после десериализации. Если код не выполняет десериализацию найденных типов, значит, уязвимость десериализации отсутствует.
Дополнительные сведения см. в статье Руководство по безопасности для DataSet и DataTable.
Устранение нарушений
- По возможности используйте Entity Framework, а не DataSet и DataTable.
- Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.
Когда лучше отключить предупреждения
Можно отключить вывод предупреждений для этого правила в следующих случаях:
- Тип, обнаруженный этим правилом, никогда не десериализуется — ни прямо, ни косвенно.
- Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
- Вы выполнили одну из мер предосторожности из раздела Устранение нарушений.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2353
// The code that's violating the rule is on this line.
#pragma warning restore CA2353
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2353.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Примеры псевдокода
Нарушение
using System.Data;
using System.Runtime.Serialization;
[XmlRoot]
public class MyClass
{
public DataSet MyDataSet { get; set; }
}
Связанные правила
CA2350: убедитесь, что входные данные DataTable.ReadXml()являются доверенными
CA2351: убедитесь, что входные данные DataSet.ReadXml()являются доверенными
CA2355: небезопасный набор данных или DataTable в графе десериализированных объектов
CA2356: ненадежные данные DataSet или DataTable в графе десериализованных веб-объектов