Бөлісу құралы:


Руководство по безопасности DataSet и DataTable

Эта статья относится к следующему:

  • .NET Framework (все версии)
  • .NET Core и более поздние версии
  • .NET 5 и более поздней версии

Типы DataSet и DataTable являются устаревшими компонентами .NET, которые позволяют представлять наборы данных в качестве управляемых объектов. Эти компоненты были введены в платформа .NET Framework 1.0 в составе исходной инфраструктуры ADO.NET. Их целью было предоставление управляемого представления реляционного набора данных, абстрагирование от того, является ли базовый источник данных XML, SQL или другой технологией.

Дополнительные сведения о ADO.NET, включая более современные парадигмы представления данных, см . в документации по ADO.NET.

Ограничения по умолчанию при десериализации набора данных или DataTable из XML

Во всех поддерживаемых версиях платформа .NET Framework, .NET Core и .NET DataSet и DataTable поместите следующие ограничения на то, какие типы объектов могут присутствовать в десериализованных данных. По умолчанию этот список ограничен:

  • Примитивы и примитивные эквиваленты: ushortbyteSqlStringuintSqlSingleintSqlMoneylongSqlInt64shortSqlInt32ulongsbyteSqlBytesfloatSqlCharsdoubleSqlDateTimeSqlGuidSqlByteSqlInt16SqlDoubleSqlDecimalSqlBooleanSqlBinaryGuidstringDateTimeOffsetdecimalTimeSpanboolcharDateTime,
  • Часто используются немитивные: Type, Uriи BigInteger.
  • Часто используемые типы System.Drawing : Color, Point, PointF, Rectangle, RectangleF, Sizeи SizeF.
  • Enum Типы.
  • Массивы и списки перечисленных выше типов.

Если входящие XML-данные содержат объект, тип которого отсутствует в этом списке:

  • Исключение создается со следующим сообщением и трассировкой стека. Сообщение об ошибке: System.InvalidOperationException: Type Name><, Version=<n.n.n.n>, Culture=<culture>, PublicKeyToken=<token value>' не допускается здесь. Трассировка стека: в System.Data.TypeLimiter.EnsureTypeIsAllowed(Type, TypeLimiter capturedLimiter) в System.Data.DataColumn.UpdateColumnType(type, StorageType typeCode) по System.Data.DataColumn.set_DataType(значение типа)

  • Операция десериализации завершается ошибкой.

При загрузке XML в существующий DataSet или DataTable экземпляр существующие определения столбцов также учитываются. Если таблица уже содержит определение столбца пользовательского типа, этот тип временно добавляется в список разрешений в течение операции десериализации XML.

Примечание.

После добавления столбцов DataTableReadXml в xml-файл не будет считывать схему, а если схема не совпадает с ней, она также не будет считываться в записях, поэтому вам потребуется добавить все столбцы самостоятельно для использования этого метода.

XmlReader xmlReader = GetXmlReader();

// Assume the XML blob contains data for type MyCustomClass.
// The following call to ReadXml fails because MyCustomClass isn't in the allowed types list.

DataTable table = new DataTable("MyDataTable");
table.ReadXml(xmlReader);

// However, the following call to ReadXml succeeds, since the DataTable instance
// already defines a column of type MyCustomClass.

DataTable table = new DataTable("MyDataTable");
table.Columns.Add("MyColumn", typeof(MyCustomClass));
table.ReadXml(xmlReader); // this call will succeed

Ограничения типа объекта также применяются при использовании XmlSerializer для десериализации экземпляра DataSet или DataTable. Однако они могут не применяться при использовании BinaryFormatter для десериализации экземпляра DataSet или DataTable.

Ограничения типа объекта не применяются при использовании DataAdapter.Fill, например при DataTable заполнении экземпляра непосредственно из базы данных без использования API десериализации XML.

Расширение списка разрешенных типов

Приложение может расширить список разрешенных типов, чтобы включить настраиваемые типы в дополнение к встроенным типам, перечисленным выше. При расширении списка разрешенных типов изменение влияет на все DataSet экземпляры DataTable приложения. Типы не могут быть удалены из встроенного списка разрешенных типов.

Расширение конфигурации (платформа .NET Framework 4.0 и более поздних версий)

App.config можно использовать для расширения списка разрешенных типов. Чтобы расширить список разрешенных типов, выполните следующие действия.

  • <configSections> Используйте элемент, чтобы добавить ссылку на раздел конфигурации System.Data.
  • Используется <system.data.dataset.serialization>/<allowedTypes> для указания дополнительных типов.

Каждый <add> элемент должен указывать только один тип с помощью имени указанного типа сборки. Чтобы добавить дополнительные типы в список разрешенных типов, используйте несколько <add> элементов.

В следующем примере показано расширение списка разрешенных типов путем добавления пользовательского типа Fabrikam.CustomType.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="system.data.dataset.serialization" type="System.Data.SerializationSettingsSectionGroup, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="allowedTypes" type="System.Data.AllowedTypesSectionHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </sectionGroup>
  </configSections>
  <system.data.dataset.serialization>
    <allowedTypes>
      <!-- <add type="assembly qualified type name" /> -->
      <add type="Fabrikam.CustomType, Fabrikam, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2b3831f2f2b744f7" />
      <!-- additional <add /> elements as needed -->
    </allowedTypes>
  </system.data.dataset.serialization>
</configuration>

Чтобы получить полное имя сборки типа, используйте свойство Type.AssemblyQualifiedName , как показано в следующем коде.

string assemblyQualifiedName = typeof(Fabrikam.CustomType).AssemblyQualifiedName;

Расширение конфигурации (платформа .NET Framework 2.0 – 3.5)

Если приложение предназначено для платформа .NET Framework версии 2.0 или 3.5, вы по-прежнему можете использовать приведенный выше механизм App.config для расширения списка разрешенных типов. Однако элемент <configSections> будет выглядеть немного иначе, как показано в следующем коде:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!-- The below <sectionGroup> and <section> are specific to .NET Framework 2.0 and 3.5. -->
    <sectionGroup name="system.data.dataset.serialization" type="System.Data.SerializationSettingsSectionGroup, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="allowedTypes" type="System.Data.AllowedTypesSectionHandler, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </sectionGroup>
  </configSections>
  <system.data.dataset.serialization>
    <allowedTypes>
      <!-- <add /> elements, as demonstrated in the .NET Framework 4.0 - 4.8 sample code above. -->
    </allowedTypes>
  </system.data.dataset.serialization>
</configuration>

Расширение программно (платформа .NET Framework, .NET Core, .NET 5+)

Список разрешенных типов также можно расширить программным способом с помощью AppDomain.SetData с хорошо известным ключом System.DataSet.DataSetDefaultAllowedTypes, как показано в следующем коде.

Type[] extraAllowedTypes = new Type[]
{
    typeof(Fabrikam.CustomType),
    typeof(Contoso.AdditionalCustomType)
};

AppDomain.CurrentDomain.SetData("System.Data.DataSetDefaultAllowedTypes", extraAllowedTypes);

Если используется механизм расширения, значение, связанное с ключом System.DataSet.DataSetDefaultAllowedTypes , должно иметь тип Type[].

В платформа .NET Framework список разрешенных типов можно расширить как с app.config, так и AppDomain.SetData. В этом случае объект DataTable будет десериализирован как часть данных, DataSet если его тип присутствует в любом списке.

Запуск приложения в режиме аудита (платформа .NET Framework)

В платформа .NET Framework DataSet и DataTable предоставляет возможность режима аудита. Если включен режим аудита, DataSet и DataTable сравнить типы входящих объектов с списком разрешенных типов. Тем не менее, если объект, тип которого не разрешен, исключение не создается. Вместо этого DataSet и DataTable уведомлять все присоединенные TraceListener экземпляры о наличии подозрительного типа, позволяя TraceListener регистрировать эти сведения. Исключение не возникает, и операция десериализации продолжается.

Предупреждение

Запуск приложения в режиме аудита должен быть временной мерой, используемой для тестирования. Если режим аудита включен и DataSet DataTable не применяет ограничения типов, что может привести к дыре безопасности в приложении. Дополнительные сведения см. в разделах, посвященных удалению всех ограничений типов и безопасности в отношении ненадежных входных данных.

Режим аудита можно включить с помощью App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <!-- See the section of this document titled "Extending through configuration" for the appropriate
         <sectionGroup> and <section> elements to put here, depending on whether you're running .NET
         Framework 2.0 - 3.5 or 4.0 - 4.8. -->
  </configSections>
  <system.data.dataset.serialization>
    <allowedTypes auditOnly="true"> <!-- setting auditOnly="true" enables audit mode -->
      <!-- Optional <add /> elements as needed. -->
    </allowedTypes>
  </system.data.dataset.serialization>
</configuration>

После включения режима аудита можно использовать App.config для подключения к вашему предпочтительному DataSet TraceListener имени встроенного TraceSource. источника трассировки System.DataSet. В следующем примере показано запись событий трассировки в консоль и в файл журнала на диске.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.Data.DataSet"
              switchType="System.Diagnostics.SourceSwitch"
              switchValue="Warning">
        <listeners>
          <!-- write to the console -->
          <add name="console"
               type="System.Diagnostics.ConsoleTraceListener" />
          <!-- *and* write to a log file on disk -->
          <add name="filelog"
               type="System.Diagnostics.TextWriterTraceListener"
               initializeData="c:\logs\mylog.txt" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

Дополнительные сведения и TraceSource TraceListenerсведения см. в документе "Практическое руководство. Использование TraceSource и фильтров с прослушивателями трассировки".

Примечание.

Запуск приложения в режиме аудита недоступен в .NET Core или .NET 5 и более поздних версиях.

Удаление всех ограничений типов

Если приложение должно удалить все ограничения, ограничивающие тип, из DataSet и DataTable:

  • Существует несколько вариантов подавления ограничений на ограничение типов.
  • Доступные параметры зависят от платформы целевых объектов приложения.

Предупреждение

Удаление всех ограничений типов может привести к дыре безопасности в приложении. При использовании этого механизма убедитесь, что приложение не использует DataSet или DataTable не считывает ненадежные входные данные. Дополнительные сведения см. в разделе CVE-2020-1147 и следующем разделе", посвященном ненадежным входным данным.

С помощью конфигурации AppContext (платформа .NET Framework 4.6 и более поздних версий .NET Core 2.1 и более поздних версий, .NET 5 и более поздних версий)

Параметр AppContext , Switch.System.Data.AllowArbitraryDataSetTypeInstantiationесли задано true для удаления всех ограничений типа, ограничивающих тип, из DataSet и DataTable.

В платформа .NET Framework этот параметр можно включить с помощью App.config, как показано в следующей конфигурации:

<configuration>
   <runtime>
      <!-- Warning: setting the following switch can introduce a security problem. -->
      <AppContextSwitchOverrides value="Switch.System.Data.AllowArbitraryDataSetTypeInstantiation=true" />
   </runtime>
</configuration>

В ASP.NET элемент <AppContextSwitchOverrides> недоступен. Вместо этого параметр можно включить с помощью web.config, как показано в следующей конфигурации:

<configuration>
    <appSettings>
        <!-- Warning: setting the following switch can introduce a security problem. -->
        <add key="AppContext.SetSwitch:Switch.System.Data.AllowArbitraryDataSetTypeInstantiation" value="true" />
    </appSettings>
</configuration>

Дополнительные сведения см. в элементе <AppContextSwitchOverrides> .

В .NET Core, .NET 5 и ASP.NET Core этот параметр управляется runtimeconfig.json, как показано в следующем формате JSON:

{
  "runtimeOptions": {
    "configProperties": {
      "Switch.System.Data.AllowArbitraryDataSetTypeInstantiation": true
    }
  }
}

Дополнительные сведения см. в разделе "Параметры конфигурации среды выполнения .NET Core".

AllowArbitraryDataSetTypeInstantiation можно также задать программным способом с помощью AppContext.SetSwitch вместо использования файла конфигурации, как показано в следующем коде:

// Warning: setting the following switch can introduce a security problem.
AppContext.SetSwitch("Switch.System.Data.AllowArbitraryDataSetTypeInstantiation", true);

Если вы выбрали предыдущий программный подход, вызов AppContext.SetSwitch должен произойти рано в начале запуска приложений.

Через реестр на уровне компьютера (платформа .NET Framework 2.0 – 4.x)

Если AppContext недоступен, ограничения типов можно отключить с помощью реестра Windows:

  • Администратор должен настроить реестр.
  • Использование реестра — это изменение на уровне компьютера и повлияет на все приложения, работающие на компьютере.
Тип значение
Раздел реестра HKLM\SOFTWARE\Microsoft\.NETFramework\AppContext
Имя значения Switch.System.Data.AllowArbitraryDataSetTypeInstantiation
Тип значения REG_SZ
Данные значений true

В 64-разрядной операционной системе это значение необходимо добавить для 64-разрядного ключа (показанного выше) и 32-разрядного ключа. 32-разрядный ключ расположен по адресу HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContext.

Дополнительные сведения об использовании реестра для настройки AppContextсм. в разделе "AppContext для потребителей библиотеки".

Безопасность в отношении ненадежных входных данных

Хотя DataSet и DataTable налагайте ограничения по умолчанию для типов, которые могут присутствовать при десериализации полезных данных XML, DataSet и DataTable обычно небезопасны при заполнении ненадежных входных данных. Ниже приведен неисчерпающий список способов чтения DataSet ненадежных входных данных или DataTable экземпляра.

  • Ссылается DataAdapter на базу данных, а DataAdapter.Fill метод используется для заполнения DataSet содержимого запроса базы данных.
  • Метод DataSet.ReadXml или DataTable.ReadXml используется для чтения XML-файла, содержащего сведения о столбце и строке.
  • DataTable Экземпляр DataSet сериализуется как часть веб-служб ASP.NET (SOAP) или конечной точки WCF.
  • Сериализатор, например XmlSerializer , используется для десериализации DataSet или DataTable экземпляра из XML-потока.
  • Сериализатор, например JsonConvert , используется для десериализации DataSet или DataTable экземпляра из потока JSON. JsonConvert — это метод в популярной библиотеке Newtonsoft.Json .
  • Сериализатор, например BinaryFormatter , используется для десериализации DataSet или DataTable экземпляра из необработанного потока байтов.

В этом документе рассматриваются вопросы безопасности для предыдущих сценариев.

Использование DataAdapter.Fill для заполнения DataSet ненадежного источника данных

Экземпляр DataSet можно заполнить с DataAdapter помощью DataAdapter.Fill метода, как показано в следующем примере.

// Assumes that connection is a valid SqlConnection object.
string queryString =
  "SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

(Приведенный выше пример кода является частью более крупного примера, найденного в Заполнение набора данных из DataAdapter.)

Большинство приложений могут упростить и предположить, что уровень базы данных является доверенным. Однако если вы привыкли моделировать приложения к угрозам , ваша модель угроз может рассмотреть границу доверия между приложением (клиентом) и уровнем базы данных (сервером). Использование взаимной проверки подлинности или проверки подлинности AAD между клиентом и сервером является одним из способов решения рисков, связанных с этим. Остальная часть этого раздела описывает возможный результат подключения клиента к ненадежным серверу.

Последствия указания на ненадежный DataAdapter источник данных зависят от реализации DataAdapter самого источника данных.

SqlDataAdapter;

Для встроенного типа SqlDataAdapter ссылка на ненадежный источник данных может привести к атаке типа "отказ в обслуживании" (DoS). Атака DoS может привести к тому, что приложение не отвечает или завершается сбоем. Если злоумышленник может насадить библиотеку DLL вместе с приложением, они также могут достичь локального выполнения кода.

Другие типы DataAdapter

DataAdapter Сторонние реализации должны оценивать свои собственные оценки о том, какие гарантии безопасности они обеспечивают перед лицом ненадежных входных данных. .NET не может обеспечить какие-либо гарантии безопасности в отношении этих реализаций.

DataSet.ReadXml и DataTable.ReadXml

DataTable.ReadXml Методы DataSet.ReadXml небезопасны при использовании с ненадежными входными данными. Настоятельно рекомендуется использовать один из альтернативных вариантов, описанных далее в этом документе.

Реализации DataSet.ReadXml и DataTable.ReadXml первоначально были созданы до уязвимостей сериализации были хорошо понятной категорией угроз. В результате код не соответствует текущим рекомендациям по обеспечению безопасности. Эти API можно использовать в качестве векторов для злоумышленников для атак DoS на веб-приложения. Эти атаки могут отрисовки веб-службы не отвечать или привести к неожиданному завершению процесса. Платформа не предоставляет меры по устранению рисков для этих категорий атак, и .NET считает это поведение "по проектированию".

.NET выпустила обновления системы безопасности для устранения некоторых проблем, таких как раскрытие информации или удаленное выполнение кода и DataSet.ReadXml DataTable.ReadXml. Обновления системы безопасности .NET могут не обеспечить полную защиту от этих категорий угроз. Мы рекомендуем всем потребителям проанализировать особенности конкретных сценариев применения и оценить их уязвимость в отношении этих рисков.

Потребители должны учитывать, что обновления безопасности для этих API могут повлиять на совместимость приложений в некоторых ситуациях. Кроме того, существует возможность обнаружения новой уязвимости в этих API, для которой .NET практически не может опубликовать обновление системы безопасности.

Рекомендуется использовать следующие api-интерфейсы:

  • Рассмотрите возможность использования одного из альтернативных вариантов, описанных далее в этом документе.
  • Выполнение отдельных оценок рисков в своих приложениях.

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

Набор данных и DataTable с помощью ASP.NET веб-служб или WCF

Можно принять DataSet экземпляр DataTable в веб-службе ASP.NET (SOAP), как показано в следующем коде:

using System.Data;
using System.Web.Services;

[WebService(Namespace = "http://contoso.com/")]
public class MyService : WebService
{
    [WebMethod]
    public string MyWebMethod(DataTable dataTable)
    {
        /* Web method implementation. */
    }
}

Вариант этого не следует принимать DataSet или DataTable напрямую в качестве параметра, а вместо этого принимать его как часть общего графа сериализованных объектов SOAP, как показано в следующем коде:

using System.Data;
using System.Web.Services;

[WebService(Namespace = "http://contoso.com/")]
public class MyService : WebService
{
    [WebMethod]
    public string MyWebMethod(MyClass data)
    {
        /* Web method implementation. */
    }
}

public class MyClass
{
    // Property of type DataTable, automatically serialized and
    // deserialized as part of the overall MyClass payload.
    public DataTable MyDataTable { get; set; }
}

Кроме того, вместо ASP.NET веб-служб используется WCF:

using System.Data;
using System.ServiceModel;

[ServiceContract(Namespace = "http://contoso.com/")]
public interface IMyContract
{
    [OperationContract]
    string MyMethod(DataTable dataTable);
    [OperationContract]
    string MyOtherMethod(MyClass data);
}

public class MyClass
{
    // Property of type DataTable, automatically serialized and
    // deserialized as part of the overall MyClass payload.
    public DataTable MyDataTable { get; set; }
}

Во всех этих случаях модель угроз и гарантии безопасности совпадают с разделом DataSet.ReadXml и DataTable.ReadXml.

Десериализация набора данных или DataTable с помощью XmlSerializer

Разработчики могут использовать XmlSerializer для десериализации DataSet и DataTable экземпляров, как показано в следующем коде:

using System.Data;
using System.IO;
using System.Xml.Serialization;

public DataSet PerformDeserialization1(Stream stream) {
    XmlSerializer serializer = new XmlSerializer(typeof(DataSet));
    return (DataSet)serializer.Deserialize(stream);
}

public MyClass PerformDeserialization2(Stream stream) {
    XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
    return (MyClass)serializer.Deserialize(stream);
}

public class MyClass
{
    // Property of type DataTable, automatically serialized and
    // deserialized as part of the overall MyClass payload.
    public DataTable MyDataTable { get; set; }
}

В таких случаях модель угроз и гарантии безопасности совпадают с разделом DataSet.ReadXml и DataTable.ReadXml. ReadXml.

Десериализация набора данных или DataTable с помощью JsonConvert

Популярную стороннюю библиотеку Newtonsoft Json.NET можно использовать для десериализации DataSet и DataTable экземпляров, как показано в следующем коде:

using System.Data;
using Newtonsoft.Json;

public DataSet PerformDeserialization1(string json) {
    return JsonConvert.DeserializeObject<DataSet>(data);
}

public MyClass PerformDeserialization2(string json) {
    return JsonConvert.DeserializeObject<MyClass>(data);
}

public class MyClass
{
    // Property of type DataTable, automatically serialized and
    // deserialized as part of the overall MyClass payload.
    public DataTable MyDataTable { get; set; }
}

Десериализация или DataSet DataTable таким образом из ненадежного большого двоичного объекта JSON не является безопасным. Этот шаблон уязвим к атаке типа "отказ в обслуживании". Такая атака может привести к сбою приложения или отрисовке его без ответа.

Примечание.

Корпорация Майкрософт не гарантирует или не поддерживает реализацию сторонних библиотек, таких как Newtonsoft.Json. Эта информация предоставляется для полноты и является точной по состоянию на момент написания этой записи.

Десериализация набора данных или DataTable с помощью BinaryFormatter

Для десериализации или экземпляра из ненадежной полезных данных никогда не следует использовать BinaryFormatter, SoapFormatterNetDataContractSerializerили связанные небезопасные формататоры:DataTable DataSet

  • Это подвержено полной удаленной атаке выполнения кода.
  • Использование пользовательского элемента SerializationBinder недостаточно для предотвращения такой атаки.

Безопасные замены

Для приложений, которые либо:

  • Примите DataSet или DataTable через конечную точку SOAP asmx или конечную точку WCF.
  • Десериализация ненадежных данных в экземпляр DataSet или DataTable.

Рассмотрите возможность замены объектной модели для использования Entity Framework. Entity Framework.

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

Для приложений, использующих .aspx конечные точки SOAP, рассмотрите возможность изменения этих конечных точек на использование WCF. WCF — это более полнофункциональное замена .asmx веб-служб. Конечные точки WCF можно предоставлять с помощью SOAP для совместимости с существующими вызывающими устройствами.

Анализаторы кода

Правила безопасности анализатора кода, которые выполняются при компиляции исходного кода, могут помочь найти уязвимости, связанные с этой проблемой безопасности в коде C# и Visual Basic. Microsoft.CodeAnalysis.FxCopAnalyzers — это пакет анализаторов кода NuGet, распределенных по nuget.org.

Общие сведения об анализаторах кода см. в разделе "Обзор анализаторов исходного кода".

Включите следующие правила Microsoft.CodeAnalysis.FxCopAnalyzers:

  • CA2350: не используйте DataTable.ReadXml() с ненадежными данными
  • CA2351: не используйте DataSet.ReadXml() с ненадежными данными
  • CA2352: небезопасный набор данных или DataTable в сериализуемом типе может быть уязвим для атак удаленного выполнения кода
  • CA2353: небезопасный набор данных или DataTable в сериализуемом типе
  • CA2354: небезопасный набор данных или DataTable в десериализированном графе объектов может быть уязвим для атак удаленного выполнения кода
  • CA2355: небезопасный тип DataSet или DataTable, найденный в графе объектов десериализации
  • CA2356: небезопасный тип DataSet или DataTable в графе объектов с возможностью десериализации в интернете
  • CA2361: убедитесь, что автогенерированный класс, содержащий DataSet.ReadXml() не используется с ненадежными данными.
  • CA2362: небезопасный набор данных или DataTable в автоматическом сериализируемом типе могут быть уязвимы для атак удаленного выполнения кода.

Дополнительные сведения о настройке правил см. в разделе "Использование анализаторов кода".

Новые правила безопасности доступны в следующих пакетах NuGet:

  • Microsoft.CodeAnalysis.FxCopAnalyzers 3.3.0: для Visual Studio 2019 версии 16.3 или более поздней версии
  • Microsoft.CodeAnalysis.FxCopAnalyzers 2.9.11: для Visual Studio 2017 версии 15.9 или более поздней версии