Sdílet prostřednictvím


CA3076: Spuštění nezabezpečeného skriptu XSLT

Vlastnost Hodnota
ID pravidla CA3076
Název Spuštění nezabezpečeného skriptu XSLT
Kategorie Zabezpečení
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 10 No

Příčina

Pokud v aplikacích .NET spustíte nezabezpečené transformace jazyka XSLT (Extensible Stylesheets Language Transformations), může procesor vyřešit nedůvěryhodné odkazy URI, které by mohly útočníkům zpřístupnit citlivé informace, což vede k útoku do odepření služby a útoků mezi weby. Další informace najdete v tématu Důležité informace o zabezpečení XSLT (Průvodce .NET).

Popis pravidla

XSLT je standard W3C (World Wide Web Consortium) pro transformaci dat XML. XSLT se obvykle používá k zápisu šablon stylů pro transformaci dat XML do jiných formátů, jako je HTML, text s pevnou délkou, text oddělený čárkami nebo jiný formát XML. I když je ve výchozím nastavení zakázáno, můžete ho pro svůj projekt povolit.

Aby se zajistilo, že nevystavíte prostor pro útoky, toto pravidlo se aktivuje vždy, když XslCompiledTransform.Load přijímá nezabezpečené kombinace instancí a XsltSettings, což umožňuje zpracování škodlivých skriptůXmlResolver.

Jak opravit porušení

Kdy potlačit upozornění

Pokud si nejste jistí, že vstup pochází z důvěryhodného zdroje, nepotlačujte pravidlo z tohoto upozornění.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklady pseudokódu

Porušení, které používá 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
        }
    }
}

Řešení, které používá 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);
        }
    }
}

Porušení – funkce dokumentu a spouštění skriptu nejsou zakázané.

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

Řešení – zakázání funkce dokumentu a spouštění skriptů

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

Poznámka:

Počínaje rozhraním .NET 10 EnableScript je vlastnost označena jako zastaralá a generuje upozornění SYSLIB0062. V .NET (Core) už není nutné explicitně nastavit tuto vlastnost, false protože spouštění skriptu není podporováno.

Viz také