CA3077: небезопасная обработка в структуре API средств чтения документов и текста XML

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

Причина

При разработке API, производных от XMLDocument и XMLTextReader, обратите внимание на DtdProcessing. Использование небезопасных экземпляров DTDProcessing при ссылке на источники внешних сущностей или их разрешении, а также при задании небезопасных значений в XML может привести к раскрытию информации.

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

DTD — это один из двух способов определения допустимости документа средством синтаксического анализа XML, как указано в стандарте XML 1.0 консорциума W3C. Это правило ищет свойства и экземпляры, в которых принимаются недоверенные данные, для предупреждения разработчиков о возможных угрозах Information Disclosure , которые могут привести к атакам типа отказ в обслуживании (DoS) . Это правило активируется, если:

  • классы XmlDocument и XmlTextReader используют значения сопоставителя по умолчанию для обработки DTD;

  • конструктор для производных классов XmlDocument или XmlTextReader не определен либо для XmlResolverне используется безопасное значение.

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

  • Перехватывайте и обрабатывайте все исключения XmlTextReader соответствующим образом, чтобы не допустить раскрытия информации.

  • Используйте XmlSecureResolver вместо XmlResolver, чтобы ограничить доступ к ресурсам для  XmlTextReader.

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

Отключайте правило этого предупреждения, только если уверены, что входные данные получены из доверенного источника.

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

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

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

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

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

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

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

Нарушение

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass () {} // warn
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2() // warn
        {
        }
    }
}

Решение

using System;
using System.Xml;

namespace TestNamespace
{
    class TestClass : XmlDocument
    {
        public TestClass ()
        {
            XmlResolver = null;
        }
    }

    class TestClass2 : XmlTextReader
    {
        public TestClass2()
        {
               XmlResolver = null;
        }
    }
}