CA3075: Zpracování nezabezpečené specifikace DTD

Vlastnost Hodnota
ID pravidla CA3075
Název Zpracování nezabezpečené specifikace DTD
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 používáte nezabezpečené DtdProcessing instance nebo odkazujete na zdroje externích entit, může analyzátor přijmout nedůvěryhodný vstup a zveřejnit citlivé informace útočníkům.

Popis pravidla

Definice typu dokumentu (DTD) je jedním ze dvou způsobů, jak může analyzátor XML určit platnost dokumentu, jak je definováno konsorciem W3C (Extensible Markup Language) 1.0 ( World Wide Web Consortium). Toto pravidlo hledá vlastnosti a instance, ve kterých jsou přijata nedůvěryhodná data, aby vývojáři upozorňovali na potenciální hrozby zpřístupnění informací nebo útoky doS (DoS ). Toto pravidlo se aktivuje v těchto případech:

V každém z těchto případů je výsledek stejný: obsah ze systému souborů nebo síťových sdílených složek z počítače, ve kterém se zpracovává XML, bude vystaven útočníkovi nebo jako vektor DoS lze použít zpracování DTD.

Jak opravit porušení

  • Zachyťte a zpracujte všechny výjimky XmlTextReader správně, aby se zabránilo zpřístupnění informací o cestě.

  • XmlSecureResolver Použijte k omezení prostředků, ke kterým má XmlTextReader přístup.

  • Nepovolte XmlReader otevření externích prostředků nastavením XmlResolver vlastnosti na hodnotu null.

  • Ujistěte se, že DataViewManager.DataViewSettingCollectionString je vlastnost přiřazená z důvěryhodného zdroje.

.NET Framework 3.5 a starší

  • Pokud pracujete s nedůvěryhodnými zdroji, zakažte zpracování DTD nastavením ProhibitDtd vlastnosti na true.

  • XmlTextReader třída má plnou důvěru dědičnost poptávky.

.NET Framework 4 a novější

  • Pokud pracujete s nedůvěryhodnými zdroji, vyhněte se povolení DtdProcessing nastavením XmlReaderSettings.DtdProcessing vlastnosti Zakázat nebo Ignorovat.

  • Ujistěte se, že Load() metoda přebírá XmlReader instance ve všech InnerXml případů.

Poznámka:

Toto pravidlo může hlásit falešně pozitivní výsledky u některých platných instancí XmlSecureResolver.

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 CA3075
// The code that's violating the rule is on this line.
#pragma warning restore CA3075

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.CA3075.severity = none

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

Příklady pseudokódu

Porušení 1

using System.IO;
using System.Xml.Schema;

class TestClass
{
    public XmlSchema Test
    {
        get
        {
            var src = "";
            TextReader tr = new StreamReader(src);
            XmlSchema schema = XmlSchema.Read(tr, null); // warn
            return schema;
        }
    }
}

Řešení 1

using System.IO;
using System.Xml;
using System.Xml.Schema;

class TestClass
{
    public XmlSchema Test
    {
        get
        {
            var src = "";
            TextReader tr = new StreamReader(src);
            XmlReader reader = XmlReader.Create(tr, new XmlReaderSettings() { XmlResolver = null });
            XmlSchema schema = XmlSchema.Read(reader , null);
            return schema;
        }
    }
}

Porušení 2

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public XmlReaderSettings settings = new XmlReaderSettings();
        public void TestMethod(string path)
        {
            var reader = XmlReader.Create(path, settings);  // warn
        }
    }
}

Řešení 2

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public XmlReaderSettings settings = new XmlReaderSettings()
        {
            DtdProcessing = DtdProcessing.Prohibit
        };

        public void TestMethod(string path)
        {
            var reader = XmlReader.Create(path, settings);
        }
    }
}

Porušení 3

using System.Xml;

namespace TestNamespace
{
    public class DoNotUseSetInnerXml
    {
        public void TestMethod(string xml)
        {
            XmlDocument doc = new XmlDocument() { XmlResolver = null };
            doc.InnerXml = xml; // warn
        }
    }
}
using System.Xml;

namespace TestNamespace
{
    public class DoNotUseLoadXml
    {
        public void TestMethod(string xml)
        {
            XmlDocument doc = new XmlDocument(){ XmlResolver = null };
            doc.LoadXml(xml); // warn
        }
    }
}

Řešení 3

using System.Xml;

public static void TestMethod(string xml)
{
    XmlDocument doc = new XmlDocument() { XmlResolver = null };
    System.IO.StringReader sreader = new System.IO.StringReader(xml);
    XmlReader reader = XmlReader.Create(sreader, new XmlReaderSettings() { XmlResolver = null });
    doc.Load(reader);
}

Porušení 4

using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace TestNamespace
{
    public class UseXmlReaderForDeserialize
    {
        public void TestMethod(Stream stream)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UseXmlReaderForDeserialize));
            serializer.Deserialize(stream); // warn
        }
    }
}

Řešení 4

using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace TestNamespace
{
    public class UseXmlReaderForDeserialize
    {
        public void TestMethod(Stream stream)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(UseXmlReaderForDeserialize));
            XmlReader reader = XmlReader.Create(stream, new XmlReaderSettings() { XmlResolver = null });
            serializer.Deserialize(reader );
        }
    }
}

Porušení 5

using System.Xml;
using System.Xml.XPath;

namespace TestNamespace
{
    public class UseXmlReaderForXPathDocument
    {
        public void TestMethod(string path)
        {
            XPathDocument doc = new XPathDocument(path); // warn
        }
    }
}

Řešení 5

using System.Xml;
using System.Xml.XPath;

namespace TestNamespace
{
    public class UseXmlReaderForXPathDocument
    {
        public void TestMethod(string path)
        {
            XmlReader reader = XmlReader.Create(path, new XmlReaderSettings() { XmlResolver = null });
            XPathDocument doc = new XPathDocument(reader);
        }
    }
}

Porušení 6

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
    }
}

Řešení 6

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
    }
}

Porušení 7

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        private static void TestMethod()
        {
            var reader = XmlTextReader.Create(""doc.xml""); //warn
        }
    }
}
using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public void TestMethod(string path)
        {
            try {
                XmlTextReader reader = new XmlTextReader(path); // warn
            }
            catch { throw ; }
            finally {}
        }
    }
}

Řešení 7

using System.Xml;

namespace TestNamespace
{
    public class TestClass
    {
        public void TestMethod(string path)
        {
            XmlReaderSettings settings = new XmlReaderSettings() { XmlResolver = null };
            XmlReader reader = XmlReader.Create(path, settings);
        }
    }
}

Poznámka:

I když XmlReader.Create se doporučuje vytvořit XmlReader instanci, existují rozdíly v chování od XmlTextReader. Hodnota XmlReader z Create normalizuje \r\n do \n hodnot XML, zatímco XmlTextReader zachovává \r\n sekvenci.