CA3076: Esecuzione di script XSLT non protetta

Proprietà valore
ID regola CA3076
Titolo Esecuzione di script XSLT non protetta
Categoria Sicurezza
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Se si esegue Extensible Stylesheets Language Transformations (XSLT) in applicazioni .NET in modo non protetto, il processore può risolvere i riferimenti URI non attendibili che potrebbero divulgare informazioni riservate a utenti malintenzionati causando attacchi Denial of Service e XSS. Per altre informazioni, vedere Considerazioni sulla sicurezza XSLT (Guida a .NET).

Descrizione regola

XSLT è uno standard W3C (World Wide Web Consortium) per la trasformazione dei dati XML. XSLT viene in genere usato per scrivere fogli di stile per trasformare i dati XML in altri formati, ad esempio HTML, testo a lunghezza fissa, testo delimitato da virgole o un formato XML diverso. Sebbene non sia consentito per impostazione predefinita, è possibile scegliere di abilitarlo per un progetto.

Per garantire di non esporre una superficie di attacco, questa regola viene attivata ogni volta che XslCompiledTransform.Load riceve una combinazione non protetta di istanze di XsltSettings e XmlResolver, che consente l'elaborazione di script dannosi.

Come correggere le violazioni

  • Sostituire l'argomento XsltSettings non protetto con XsltSettings.Default o con un'istanza che ha disabilitato l'esecuzione di script e funzioni del documento.

  • Sostituire l'argomento XmlResolver con Null o con un'istanza di XmlSecureResolver .

Quando eliminare gli avvisi

A meno che non si abbia la certezza che l'input provenga da un'origine attendibile, non escludere una regola da questo avviso.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempi di pseudo-codice

Violazione che usa Xslt Impostazioni. 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
        }
    }
}

Soluzione che usa Xslt Impostazioni. Predefinito

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);
        }
    }
}

Violazione: la funzione del documento e l'esecuzione dello script non sono disabilitate

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

Soluzione: disabilitare la funzione del documento e l'esecuzione di 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 { }
        }
    }
}

Vedi anche