Share via


CA3075: Onveilige DTD-verwerking

Eigenschappen Weergegeven als
Regel-id CA3075
Titel Onveilige DTD-verwerking
Categorie Beveiliging
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Als u onveilige DtdProcessing instanties gebruikt of naar externe entiteitsbronnen verwijst, kan de parser niet-vertrouwde invoer accepteren en gevoelige informatie openbaar maken voor aanvallers.

Beschrijving van regel

Een documenttypedefinitie (DTD) is een van de twee manieren waarop een XML-parser de geldigheid van een document kan bepalen, zoals gedefinieerd door het World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0. Met deze regel worden eigenschappen en instanties gezocht waarbij niet-vertrouwde gegevens worden geaccepteerd om ontwikkelaars te waarschuwen over mogelijke bedreigingen voor openbaarmaking van informatie of DoS-aanvallen (Denial of Service). Deze regel wordt geactiveerd wanneer:

In elk van deze gevallen is het resultaat hetzelfde: de inhoud van het bestandssysteem of netwerkshares van de computer waarop de XML wordt verwerkt, wordt blootgesteld aan de aanvaller, of DTD-verwerking kan worden gebruikt als een DoS-vector.

Schendingen oplossen

  • Catch and process all XmlTextReader exceptions correct to avoid path information disclosure.

  • Gebruik de XmlSecureResolver functie om de resources te beperken waartoe xmlTextReader toegang heeft.

  • Sta het XmlReader openen van externe resources niet toe door de XmlResolver eigenschap in te stellen op null.

  • Zorg ervoor dat de DataViewManager.DataViewSettingCollectionString eigenschap is toegewezen vanuit een vertrouwde bron.

.NET Framework 3.5 en eerder

  • Schakel DTD-verwerking uit als u te maken hebt met niet-vertrouwde bronnen door de ProhibitDtd eigenschap in te stellen op true.

  • De xmlTextReader-klasse heeft een volledig vertrouwensovernamevraag.

.NET Framework 4 en hoger

  • Schakel DtdProcessing niet in als u te maken hebt met niet-vertrouwde bronnen door de XmlReaderSettings.DtdProcessing eigenschap in te stellen op Verbieden of Negeren.

  • Zorg ervoor dat de methode Load() een XmlReader-exemplaar gebruikt in alle InnerXml-gevallen.

Notitie

Deze regel kan fout-positieven rapporteren voor een aantal geldige XmlSecureResolver-exemplaren.

Wanneer waarschuwingen onderdrukken

Tenzij u zeker weet dat de invoer afkomstig is van een vertrouwde bron, moet u geen regel van deze waarschuwing onderdrukken.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Voorbeelden van pseudocode

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

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

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

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

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

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

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

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

Schending 5

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

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

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

Schending 6

using System.Xml;

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

Oplossing 6

using System.Xml;

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

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

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

Notitie

Hoewel XmlReader.Create dit de aanbevolen manier is om een XmlReader exemplaar te maken, zijn er gedragsverschillen van XmlTextReader. Een XmlReader van Create normaliseren \r\n naar \n in XML-waarden, terwijl XmlTextReader de \r\n reeks behouden blijft.