Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2354 |
| Заголовок | Небезопасные объекты DataSet или DataTable в графе десериализованных объектов могут быть уязвимы для атаки с удалённым выполнением кода. |
| Категория | Безопасность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Десериализация с помощью сериализованного System.Runtime.Serialization.IFormatter, и граф объектов приведенного типа может включать DataSet или DataTable.
Это правило использует другой подход по сравнению с похожим правилом CA2352: небезопасные данные DataSet или DataTable в сериализуемом типе могут быть уязвимыми для атак с удаленным выполнением кода.
Описание правила
В случае десериализации ненадежных входных данных с помощью BinaryFormatter, если граф десериализованных объектов содержит DataSet или DataTable, злоумышленник может создать зловредную полезную нагрузку для атаки с удаленным выполнением кода.
Дополнительные сведения см. в статье Руководство по безопасности для DataSet и DataTable.
Устранение нарушений
- По возможности используйте Entity Framework, а не DataSet и DataTable.
- Примените к сериализованным данным защиту от несанкционированных изменений. После сериализации криптографически подпишите сериализованные данные. Перед десериализацией проверьте криптографическую подпись. Защитите криптографический ключ от раскрытия и реализуйте регулярную смену ключей.
Когда лучше отключить предупреждения
Можно отключить вывод предупреждений для этого правила в следующих случаях:
- Вам известно, что входные данные являются доверенными. Учитывайте, что со временем могут измениться как границы доверия, так и потоки данных приложения.
- Вы выполнили одну из мер предосторожности из раздела Устранение нарушений.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2354
// The code that's violating the rule is on this line.
#pragma warning restore CA2354
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2354.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Примеры псевдокода
Нарушение
using System.Data;
using System.IO;
using System.Runtime.Serialization;
[Serializable]
public class MyClass
{
public MyOtherClass OtherClass { get; set; }
}
[Serializable]
public class MyOtherClass
{
private DataSet myDataSet;
}
public class ExampleClass
{
public MyClass Deserialize(Stream stream)
{
BinaryFormatter bf = new BinaryFormatter();
return (MyClass) bf.Deserialize(stream);
}
}
Связанные правила
CA2350: убедитесь в том, что данные, передаваемые в DataTable.ReadXml(), являются доверенными
CA2351: убедитесь, что данные, передаваемые в DataSet.ReadXml(), являются доверенными
CA2353: небезопасный набор данных или DataTable в сериализуемом типе
CA2355: небезопасный набор данных или DataTable в графе десериализированных объектов
CA2356: ненадежные данные DataSet или DataTable в графе десериализованных веб-объектов