Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эта статья относится к следующему:
- .NET Framework (все версии)
- .NET Core и более поздние версии
- .NET 5 и более поздней версии
Типы DataSet и DataTable являются устаревшими компонентами .NET, которые позволяют представлять наборы данных в качестве управляемых объектов. Эти компоненты были введены в платформе .NET Framework 1.0 в составе исходной инфраструктуры ADO.NET. Их целью было предоставление управляемого представления реляционного набора данных, абстрагирование от того, является ли базовый источник данных XML, SQL или другой технологией.
Дополнительные сведения о ADO.NET, включая более современные парадигмы представления данных, см. в документации по ADO.NET.
Ограничения по умолчанию при десериализации DataSet или DataTable из XML
Во всех поддерживаемых версиях платформы .NET Framework, .NET Core и .NET DataSet
и DataTable
накладывают следующие ограничения на то, какие типы объектов могут быть представлены в десериализованных данных. По умолчанию этот список ограничен:
- Примитивы и примитивные эквиваленты:
bool
,char
,sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
,float
,double
,decimal
,DateTime
,DateTimeOffset
,TimeSpan
,string
,Guid
,SqlBinary
,SqlBoolean
,SqlByte
,SqlBytes
,SqlChars
,SqlDateTime
,SqlDecimal
,SqlDouble
,SqlGuid
,SqlInt16
,SqlInt32
,SqlInt64
,SqlMoney
,SqlSingle
иSqlString
. - Часто используются немитивные:
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.
Примечание.
После добавления столбцов в DataTable
, ReadXml
не будет считывать схему из 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
. В этом случае DataSet
и DataTable
позволят десериализовать объект как часть данных, если его тип присутствует в любом из списков.
Запуск приложения в режиме аудита (платформа .NET Framework)
В платформе .NET Framework DataSet
и DataTable
предоставляют возможность режима аудита. Если включен режим аудита, DataSet
и DataTable
сравнивают типы входящих объектов с списком разрешенных типов. Тем не менее, если объект, тип которого не разрешен, наблюдается, исключение не выбрасывается. Вместо этого DataSet
и DataTable
уведомлять все присоединенные TraceListener
экземпляры о наличии подозрительного типа, позволяя TraceListener
регистрировать эти сведения. Исключение не возникает, и операция десериализации продолжается.
Предупреждение
Запуск приложения в режиме аудита должен быть временной мерой, используемой для тестирования. Если режим аудита включен и DataSet
DataTable
не применяет ограничения типов, что может привести к дыре безопасности в приложении. Дополнительные сведения см. в разделах, посвященных удалению всех ограничений типов и безопасности в отношении ненадежных входных данных.
Режим аудита можно включить с помощью App.config:
- Об информации о правильном значении для элемента см. в разделе
<configSections>
в этом документе. - Используется
<allowedTypes auditOnly="true">
для включения режима аудита, как показано в следующей разметке.
<?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 для подключения вашего предпочтительного компонента к встроенному TraceListener
. Имя встроенного источника трассировки — 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-файла, содержащего сведения о столбце и строке. - Экземпляр
DataSet
илиDataTable
сериализуется как часть веб-служб ASP.NET (SOAP) или конечной точки WCF. - Сериализатор, например
XmlSerializer
, используется для десериализацииDataSet
илиDataTable
экземпляра из XML-потока. - Сериализатор, например
JsonConvert
, используется для десериализацииDataSet
илиDataTable
экземпляра из потока JSON.JsonConvert
— это метод в популярной сторонней библиотеке Newtonsoft.Json. - Сериализатор, например
BinaryFormatter
, используется для десериализацииDataSet
илиDataTable
экземпляра из необработанного потока байтов.
В этом документе рассматриваются вопросы безопасности для предыдущих сценариев.
Используйте DataAdapter.Fill
для заполнения DataSet
из ненадежного источника данных
Экземпляр DataSet
можно заполнить, используя метод DataAdapter
, как показано в следующем примере.
// 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
Методы DataSet.ReadXml
и DataTable.ReadXml
небезопасны при использовании с ненадежными входными данными. Настоятельно рекомендуется использовать один из альтернативных вариантов, описанных далее в этом документе.
Реализации DataSet.ReadXml
и DataTable.ReadXml
изначально были созданы до того, как уязвимости сериализации стали хорошо понимаемой категорией угроз. В результате код не соответствует текущим рекомендациям по обеспечению безопасности. Эти API можно использовать в качестве векторов для злоумышленников для атак DoS на веб-приложения. Эти атаки могут сделать веб-службу неотзывчивой или привести к неожиданному завершению процесса. Платформа не предоставляет меры защиты для этих категорий атак, и .NET считает это поведение предусмотренным.
.NET выпустил обновления системы безопасности для устранения некоторых проблем, таких как раскрытие информации или удаленное выполнение кода в DataSet.ReadXml
и DataTable.ReadXml
. Обновления системы безопасности .NET могут не обеспечить полную защиту от этих категорий угроз. Мы рекомендуем всем потребителям проанализировать особенности конкретных сценариев применения и оценить их уязвимость в отношении этих рисков.
Потребители должны учитывать, что обновления безопасности для этих API могут повлиять на совместимость приложений в некоторых ситуациях. Кроме того, существует возможность обнаружения новой уязвимости в этих API, для которой .NET практически не может опубликовать обновление системы безопасности.
Мы рекомендуем потребителям этих API либо:
- Рассмотрите возможность использования одного из альтернативных вариантов, описанных далее в этом документе.
- Выполнение отдельных оценок рисков в своих приложениях.
Это единственная ответственность потребителя, чтобы определить, следует ли использовать эти API. Потребители должны оценивать любые риски безопасности, технических и юридических рисков, включая нормативные требования, которые могут сопровождать использование этих API.
Набор данных и таблица данных через веб-службы 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.
Десериализовать DataSet или 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
, NetDataContractSerializer
, SoapFormatter
или связанные небезопасные формататоры для десериализации экземпляра DataSet
или DataTable
из ненадежных данных:
- Это подвержено полной удаленной атаке выполнения кода.
- Использование пользовательского элемента
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 или более поздней версии