Udostępnij za pośrednictwem


CA3076: Niezabezpieczone wykonywanie skryptu XSLT

Właściwości Wartość
Identyfikator reguły CA3076
Tytuł Niezabezpieczone wykonywanie skryptu XSLT
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Przyczyna

W przypadku wykonywania rozszerzalnych przekształceń języka arkuszy stylów (XSLT) w aplikacjach platformy .NET niezabezpieczony procesor może rozwiązać niezaufane odwołania identyfikatora URI, które mogą ujawnić poufne informacje osobom atakującym, co prowadzi do ataków typu "odmowa usługi" i "między witrynami". Aby uzyskać więcej informacji, zobacz XSLT Security Considerations(.NET Guide)(Zagadnienia dotyczące zabezpieczeń XSLT(.NET Guide).

Opis reguły

XSLT to standard World Wide Web Consortium (W3C) umożliwiający przekształcanie danych XML. XSLT jest zwykle używany do pisania arkuszy stylów w celu przekształcania danych XML w inne formaty, takie jak HTML, tekst o stałej długości, tekst rozdzielony przecinkami lub inny format XML. Mimo że jest to domyślnie zabronione, możesz wybrać opcję włączenia go dla projektu.

Aby upewnić się, że nie uwidaczniasz powierzchni ataków, ta reguła jest wyzwalana za każdym razem, gdy element XslCompiledTransform.Load odbiera niezabezpieczone wystąpienia kombinacji XsltSettings elementów i XmlResolver, które umożliwiają przetwarzanie złośliwych skryptów.

Jak naprawić naruszenia

  • Zastąp niezabezpieczony argument XsltSettings ciągiem XsltSettings.Default lub z wystąpieniem, które wyłączyło funkcję dokumentu i wykonywanie skryptu.

  • Zastąp XmlResolver argument wartością null lub wystąpieniem XmlSecureResolver .

Kiedy pomijać ostrzeżenia

Jeśli nie masz pewności, że dane wejściowe są znane z zaufanego źródła, nie pomijaj reguły z tego ostrzeżenia.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady przykładów kodu przykładowego

Naruszenie używające elementu 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
        }
    }
}

Rozwiązanie korzystające z elementu 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);
        }
    }
}

Naruszenie — funkcja dokumentu i wykonywanie skryptu nie są wyłączone

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

Rozwiązanie — wyłączanie funkcji dokumentu i wykonywania skryptu

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

Zobacz też