Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA3075 |
| Titel | Onveilige DTD-verwerking |
| Categorie | Beveiliging |
| Oplossing is brekend of niet-brekend | Onbreekbaar |
| Standaard ingeschakeld in .NET 10 | Nee |
| Toepasselijke talen | C# en Visual Basic |
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 is de eigenschap ingesteld op Parse.
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.
Hoe schendingen op te lossen
Zorg ervoor dat je alle XmlTextReader-excepties correct afhandelt om het onthullen van padinformatie te voorkomen.
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 volledige vertrouwenseis voor overerving.
.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 vals-positieven rapporteren op sommige geldige XmlSecureResolver-exemplaren.
Wanneer waarschuwingen onderdrukken
Tenzij u zeker weet dat de invoer afkomstig is van een vertrouwde bron, negeer dan geen regel in deze waarschuwing.
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
Voor meer informatie, zie Codeanalysewaarschuwingen onderdrukken.
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 );
}
}
}
Inbreuk 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 de aanbevolen manier is om een XmlReader instantie te maken, zijn er gedragsverschillen ten opzichte van XmlTextReader. Een XmlReader van Create normaliseert \r\n naar \n in XML-waarden, terwijl XmlTextReader de \r\n reeks behoudt.