Share via


CA3076: Osäker XSLT-skriptkörning

Property Värde
Regel-ID CA3076
Rubrik Osäker XSLT-skriptkörning
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

Om du kör XSLT (Extensible Stylesheets Language Transformations) i .NET-program på ett osäkert sätt kan processorn lösa obetrodda URI-referenser som kan avslöja känslig information för angripare, vilket leder till Denial of Service- och Cross-Site-attacker. Mer information finns i XSLT Security Considerations(.NET Guide).

Regelbeskrivning

XSLT är en W3C-standard (World Wide Web Consortium) för transformering av XML-data. XSLT används vanligtvis för att skriva formatmallar för att omvandla XML-data till andra format som HTML, text med fast längd, kommaavgränsad text eller ett annat XML-format. Även om det är förbjudet som standard kan du välja att aktivera det för projektet.

För att säkerställa att du inte exponerar en attackyta utlöses den här regeln när XslCompiledTransform.Load tar emot osäkra kombinationsinstanser av och XmlResolver, vilket tillåter bearbetning av XsltSettings skadliga skript.

Så här åtgärdar du överträdelser

  • Ersätt det osäkra Xslt Inställningar argumentet med Xslt Inställningar.Default eller med en instans som har inaktiverat dokumentfunktionen och skriptkörningen.

  • XmlResolver Ersätt argumentet med null eller en XmlSecureResolver instans.

När du ska ignorera varningar

Om du inte är säker på att indata är kända för att komma från en betrodd källa ska du inte utelämna en regel från den här varningen.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel på pseudokod

Överträdelse som använder Xslt Inställningar. 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
        }
    }
}

Lösning som använder Xslt Inställningar. Standard

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

Överträdelse – dokumentfunktionen och skriptkörningen har inte inaktiverats

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

Lösning – inaktivera dokumentfunktion och skriptkörning

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

Se även