Поделиться через


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

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

Причина

Если вы выполняете расширяемые преобразования стилей (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 , так как выполнение скрипта не поддерживается.

См. также