CA2361: убедитесь, что автогенерированный класс, содержащий DataSet.ReadXml() не используется с ненадежными данными.

Свойство Значение
Идентификатор правила CA2361
Заголовок Проверка того, что автоматически сформированный класс, который содержит DataSet.ReadXml(), не используется с ненадежными данными
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Метод DataSet.ReadXml был вызван или указан и находится в автоматически созданном коде.

Это правило классифицирует автоматически сформированный код следующим образом:

CA2351 является аналогичным правилом, действующим, когда метод DataSet.ReadXml отображается не в автоматически созданном коде.

Описание правила

При десериализации DataSet с недоверенными входными данными злоумышленник может создавать вредоносные входные данные для проведения атаки типа "отказ в обслуживании". Могут существовать неизвестные уязвимости удаленного выполнения кода.

Это правило похоже на CA2351, но для автоматически созданного кода для представления данных в памяти в приложении с графическим пользовательским интерфейсом. Обычно эти автоматически сформированные классы не десериализуются из недоверенных входных данных. Потребление в приложении может быть различным.

Дополнительные сведения см. в статье Руководство по безопасности для DataSet и DataTable.

Устранение нарушений

  • По возможности используйте Entity Framework, а не DataSet.
  • Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.

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

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

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

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

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

#pragma warning disable CA2361
// The code that's violating the rule is on this line.
#pragma warning restore CA2361

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA2361.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Примеры псевдокода

Нарушение

namespace ExampleNamespace
{
    /// <summary>
    ///Represents a strongly typed in-memory cache of data.
    ///</summary>
    [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 partial class Something : global::System.Data.DataSet {

        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
                this.Reset();
                global::System.Data.DataSet ds = new global::System.Data.DataSet();
                ds.ReadXml(reader);
                if ((ds.Tables["Something"] != null)) {
                    base.Tables.Add(new SomethingTable(ds.Tables["Something"]));
                }
                this.DataSetName = ds.DataSetName;
                this.Prefix = ds.Prefix;
                this.Namespace = ds.Namespace;
                this.Locale = ds.Locale;
                this.CaseSensitive = ds.CaseSensitive;
                this.EnforceConstraints = ds.EnforceConstraints;
                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
                this.InitVars();
            }
            else {
                this.ReadXml(reader);
                this.InitVars();
            }
        }
    }
}

CA2350: убедитесь, что входные данные DataTable.ReadXml()являются доверенными

CA2351: убедитесь, что входные данные DataSet.ReadXml()являются доверенными

CA2352: небезопасный набор данных или DataTable в сериализуемом типе может быть уязвим для атак удаленного выполнения кода

CA2353: небезопасный набор данных или DataTable в сериализуемом типе

CA2354: небезопасный набор данных или DataTable в графе десериализированных объектов может быть уязвим для удаленной атаки на выполнение кода

CA2355: небезопасный набор данных или DataTable в графе десериализированных объектов

CA2356: ненадежные данные DataSet или DataTable в графе десериализованных веб-объектов

CA2362: небезопасный набор данных или DataTable в автоматическом сериализируемом типе могут быть уязвимы для атак удаленного выполнения кода.