CA5369: использование XmlReader для десериализации
Свойство | Значение |
---|---|
Идентификатор правила | CA5369 |
Заголовок | Использование XmlReader для десериализации |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | 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)));