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:
DtdProcessing is ingeschakeld op het XmlReader exemplaar, waarmee externe XML-entiteiten worden omgezet met behulp van XmlUrlResolver.
De InnerXml eigenschap in de XML is ingesteld.
DtdProcessing de eigenschap is ingesteld op Parseren.
Niet-vertrouwde invoer wordt verwerkt met behulp XmlResolver van XmlSecureResolver.
De XmlReader.Create methode wordt aangeroepen met een onveilig XmlReaderSettings exemplaar of helemaal geen exemplaar.
XmlReader wordt gemaakt met onveilige standaardinstellingen of -waarden.
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.