Partilhar via


CA3076: Execução de script XSLT insegura

Property valor
ID da regra CA3076
Título Execução de script XSLT insegura
Categoria Segurança
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Não

Motivo

Se você executar XSLT (Extensible Stylesheets Language Transformations) em aplicativos .NET de forma insegura, o processador poderá resolver referências de URI não confiáveis que podem divulgar informações confidenciais a invasores, levando a ataques de negação de serviço e entre sites. Para obter mais informações, consulte Considerações de segurança XSLT (Guia .NET).

Descrição da regra

XSLT é um padrão W3C (World Wide Web Consortium) para transformar dados XML. XSLT é normalmente usado para escrever folhas de estilo para transformar dados XML em outros formatos, como HTML, texto de comprimento fixo, texto separado por vírgulas ou um formato XML diferente. Embora proibido por padrão, você pode optar por habilitá-lo para seu projeto.

Para garantir que você não esteja expondo uma superfície de ataque, essa regra será acionada sempre que o XslCompiledTransform.Load recebe instâncias de combinação inseguras de e XmlResolver, o que permite o processamento de XsltSettings scripts mal-intencionados.

Como corrigir violações

  • Substitua o argumento XsltSettings inseguro por XsltSettings.Default ou com uma instância que tenha desativado a função de documento e a execução de script.

  • Substitua o XmlResolver argumento por null ou uma XmlSecureResolver instância.

Quando suprimir avisos

A menos que você tenha certeza de que a entrada é conhecida por ser de uma fonte confiável, não suprima uma regra deste aviso.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplos de pseudocódigo

Violação que usa 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
        }
    }
}

Solução que usa 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);
        }
    }
}

Violação — função de documento e execução de script não desativada

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 { }
        }
    }
}

Solução — desative a função de documento e a execução de scripts

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 { }
        }
    }
}

Consulte também