Бөлісу құралы:


CA3076: выполнение небезопасного скрипта XSLT

Свойство Значение
Идентификатор правила CA3076
Заголовок Выполнение небезопасного скрипта XSLT
Категория Безопасность
Исправление является разрушающим или неразрушающим Неразрывный
Включен по умолчанию в .NET 10 Нет
Применимые языки C# и Visual Basic

Причина

Если вы небезопасно выполняете преобразования расширяемых таблиц стилей (XSLT) в приложениях .NET, обработчик может разрешить ненадежные ссылки URI, что может привести к раскрытию конфиденциальной информации злоумышленникам и вызвать атаки типа "отказ в обслуживании" и межсайтовые атаки. Дополнительные сведения см. в руководстве по безопасности XSLT (руководство по .NET).

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

XSLT — это стандарт консорциума W3C для преобразования данных XML. XSLT обычно используется для записи таблиц стилей в целях преобразования данных XML в другие форматы, такие как HTML, текст фиксированной длины, текст с разделителями-запятыми или другой формат XML. Хотя он запрещен по умолчанию, его можно включить для проекта.

Чтобы обезопасить вас от атак, это правило активируется каждый раз, когда XslCompiledTransform.Load получает небезопасную комбинацию экземпляров XsltSettings и XmlResolver, которая допускает обработку вредоносных скриптов.

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

  • Замените небезопасный аргумент XsltSettings на XsltSettings.Default или на экземпляр, в котором отключены функции документа и выполнение скриптов.
  • Замените аргумент XmlResolver на null или экземпляр XmlSecureResolver.

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

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

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

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

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

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

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

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

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

Нарушение, использующее XsltSettings.TrustedXslt

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
         void TestMethod()
        {
             XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
             var settings = XsltSettings.TrustedXslt;
             var resolver = new XmlUrlResolver();
             xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
        }
    }
}

Решение, которое использует XsltSettings.Default

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        void TestMethod()
        {
            XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
            var settings = XsltSettings.Default;
            var resolver = new XmlUrlResolver();
            xslCompiledTransform.Load("testStylesheet", settings, resolver);
        }
    }
}

Нарушение — функция документа и выполнение скрипта не отключены

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod(XsltSettings settings)
        {
            try
            {
                XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
                var resolver = new XmlUrlResolver();
                xslCompiledTransform.Load("testStylesheet", settings, resolver); // warn
            }
            catch { throw; }
            finally { }
        }
    }
}

Решение— отключение функции документа и выполнения скрипта

using System.Xml;
using System.Xml.Xsl;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod(XsltSettings settings)
        {
            try
            {
                XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
                settings.EnableDocumentFunction = false;
                settings.EnableScript = false;
                var resolver = new XmlUrlResolver();
                xslCompiledTransform.Load("testStylesheet", settings, resolver);
            }
            catch { throw; }
            finally { }
        }
    }
}

Замечание

Начиная с .NET 10 EnableScript свойство помечается как устаревшее и создает предупреждение SYSLIB0062. В .NET (Core) больше не требуется явно задать это свойство false , так как выполнение скрипта не поддерживается.

См. также