CA3076: Execução de script XSLT não seguro
Property | Valor |
---|---|
ID da regra | CA3076 |
Título | Execução de script XSLT não seguro |
Categoria | Segurança |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Não |
Causa
Se você executar XSLT (Extensible Stylesheets Language Transformations) em aplicativos .NET de maneira não segura, o processador poderá resolver referências de URI não confiáveis que poderiam divulgar informações confidenciais a invasores, resultando em ataques entre sites e de negação de serviço. Para saber mais, confira Considerações sobre segurança do XSLT (Guia do .NET).
Descrição da regra
O XSLT é um padrão W3C (World Wide Web Consortium) para transformar dados XML. O XSLT normalmente é usado para gravar folhas de estilo para transformar dados XML em outros formatos, como HTML, texto de comprimento fixo, texto separado por vírgula 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 é disparada sempre que o XslCompiledTransform.Load recebe instâncias de combinação inseguras de XsltSettings e XmlResolver, o que permite o processamento de script mal-intencionado.
Como corrigir violações
Substitua o argumento XsltSettings inseguro por XsltSettings.Default ou com uma instância que desabilitou a função de documento e a execução do script.
Substitua o argumento XmlResolver por nulo ou uma instância XmlSecureResolver.
Quando suprimir avisos
A menos que você tenha certeza de que se sabe que a entrada vem de uma fonte confiável, não suprima uma regra desse aviso.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA3076.severity = none
Para obter mais informações, confira 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 – a função de documento e a execução do script não estão desabilitadas
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 – desabilitar a função de documento e a execução de script
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 { }
}
}
}