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 8 No

Příčina

Pokud v aplikacích .NET spustíte nezabezpečené transformace jazyka XSLT (Extensible Stylesheets Language Transformations), procesor může vyřešit nedůvěryhodné odkazy URI, které by mohly útočníkům zpřístupnit citlivé informace, což vede k útokům typu Denial of Service a cross-site. Další informace najdete v tématu Aspekty zabezpečení XSLT(.NET Guide).

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 XmlResolver, což umožňuje zpracování škodlivých skriptůXsltSettings.

Jak opravit porušení

  • Nahraďte nezabezpečený argument Xslt Nastavení Xslt NastaveníDefault nebo instancí, která zakázala funkci dokumentu a provádění skriptu.

  • XmlResolver Nahraďte argument hodnotou null nebo XmlSecureResolver instancí.

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á Xslt Nastavení. 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á Xslt Nastavení Výchozí

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

Viz také