CA5369: использование XmlReader для десериализации

Свойство Значение
Идентификатор правила CA5369
Заголовок Использование XmlReader для десериализации
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Десериализация ненадежных входных XML-данных с помощью экземпляра XmlSerializer.Deserialize без объекта XmlReader может привести к отказу в обслуживании, раскрытию информации и подделкам запросов на стороне сервера. Эти атаки становятся возможными из-за недоверенных DTD и обработки схемы XML, которая позволяет включать бомбы XML и вредоносные внешние сущности в XML. Отключить DTD можно только с помощью XmlReader. Для обработки встроенной схемы XML в виде XmlReader свойство ProhibitDtd и ProcessInlineSchema по умолчанию имеет значение false в .NET Framework 4.0 и более поздних версий. Другие параметры, такие как Stream, TextReader и XmlSerializationReader, не могут отключить обработку DTD.

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

Обработка недоверенных DTD и схем XML может разрешить загрузку опасных внешних ссылок, которые должны быть ограничены с помощью XmlReader с безопасным распознавателем или с отключенной обработкой DTD и встроенных схем DTD. Это правило обнаруживает код, использующий метод XmlSerializer.Deserialize, и не принимает XmlReader в качестве параметра конструктора.

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

Не используйте перегрузки XmlSerializer.Deserialize, кроме Deserialize(XmlReader), Deserialize(XmlReader, String), Deserialize(XmlReader, XmlDeserializationEvents) или Deserialize(XmlReader, String, XmlDeserializationEvents).

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

Это предупреждение можно отключить, если проанализированный XML поступает из доверенного источника и, следовательно, не может быть изменен.

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

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

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

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

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

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

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

Нарушение

В приведенном ниже примере псевдокода показан шаблон, обнаруживаемый этим правилом. Тип первого параметра XmlSerializer.Deserialize не является XmlReader или производным от него классом.

using System.IO;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass).Deserialize(new FileStream("filename", FileMode.Open));

Решение

using System.IO;
using System.Xml;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass)).Deserialize(XmlReader.Create (new FileStream("filename", FileMode.Open)));