Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2362 |
| Заголовок | Небезопасный DataSet или DataTable в автоматически созданном сериализуемом типе может быть уязвимым для атак удаленного выполнения кода. |
| Категория | Безопасность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Класс или структура, помеченные как SerializableAttribute, содержат поле или свойство DataSet или DataTable и не имеют DesignerCategoryAttribute.
Правило CA2352 действует так же при отсутствии DesignerCategoryAttribute.
Описание правила
В случае десериализации ненадежных входных данных с помощью BinaryFormatter, если граф десериализованных объектов содержит DataSet или DataTable, злоумышленник может создать зловредную полезную нагрузку для атаки с удаленным выполнением кода.
Это правило похоже на CA2352, но для автоматически созданного кода для представления данных в памяти в приложении с графическим пользовательским интерфейсом. Обычно эти автоматически сформированные классы не десериализуются из недоверенных входных данных. Использование вашего приложения может быть различным.
Это правило находит типы, которые становятся небезопасными после десериализации. Если код не выполняет десериализацию найденных типов, значит, уязвимость десериализации отсутствует.
Дополнительные сведения см. в статье Руководство по безопасности для DataSet и DataTable.
Устранение нарушений
- По возможности используйте Entity Framework, а не DataSet и DataTable.
- Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.
Когда лучше отключить предупреждения
Можно отключить вывод предупреждений для этого правила в следующих случаях:
- Тип, обнаруженный этим правилом, никогда не десериализуется — ни прямо, ни косвенно.
- Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
- Вы выполнили одну из мер предосторожности из раздела Устранение нарушений.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2362
// The code that's violating the rule is on this line.
#pragma warning restore CA2362
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2362.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Примеры псевдокода
Нарушение
using System.Data;
using System.Xml.Serialization;
namespace ExampleNamespace
{
[global::System.CodeDom.Compiler.GeneratedCode(""System.Data.Design.TypedDataSetGenerator"", ""2.0.0.0"")]
[global::System.Serializable()]
[global::System.ComponentModel.DesignerCategoryAttribute(""code"")]
[global::System.ComponentModel.ToolboxItem(true)]
[global::System.Xml.Serialization.XmlSchemaProviderAttribute(""GetTypedDataSetSchema"")]
[global::System.Xml.Serialization.XmlRootAttribute(""Package"")]
[global::System.ComponentModel.Design.HelpKeywordAttribute(""vs.data.DataSet"")]
public class ExampleClass : global::System.Data.DataSet {
private DataTable table;
}
}
Связанные правила
CA2350: убедитесь в том, что данные, передаваемые в DataTable.ReadXml(), являются доверенными
CA2351: убедитесь, что данные, передаваемые в DataSet.ReadXml(), являются доверенными
CA2353: небезопасный набор данных или DataTable в сериализуемом типе
CA2355: небезопасный набор данных или DataTable в графе десериализированных объектов
CA2356: ненадежные данные DataSet или DataTable в графе десериализованных веб-объектов