CA3075: Osäker DTD-bearbetning
Property | Värde |
---|---|
Regel-ID | CA3075 |
Title | Osäker DTD-bearbetning |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
Om du använder osäkra DtdProcessing instanser eller refererar till externa entitetskällor kan parsern acceptera ej betrodda indata och lämna ut känslig information till angripare.
Regelbeskrivning
En dokumenttypsdefinition (DTD) är ett av två sätt som en XML-parser kan fastställa giltigheten för ett dokument, enligt definitionen i World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0. Den här regeln söker efter egenskaper och instanser där ej betrodda data accepteras för att varna utvecklare om potentiella Information Disclosure-hot eller DoS-attacker (Denial of Service). Den här regeln utlöses när:
DtdProcessing är aktiverat på instansen XmlReader , vilket löser externa XML-entiteter med hjälp av XmlUrlResolver.
Egenskapen InnerXml i XML har angetts.
DtdProcessing egenskapen är inställd på Parsa.
Ej betrodda indata bearbetas med i XmlResolver stället för XmlSecureResolver.
Metoden XmlReader.Create anropas med en osäker XmlReaderSettings instans eller ingen instans alls.
XmlReader skapas med osäkra standardinställningar eller värden.
I vart och ett av dessa fall är resultatet detsamma: innehållet från filsystemet eller nätverksresurserna från datorn där XML-koden bearbetas kommer att exponeras för angriparen, eller så kan DTD-bearbetning användas som en DoS-vektor.
Så här åtgärdar du överträdelser
Fånga och bearbeta alla XmlTextReader-undantag korrekt för att undvika att sökvägsinformation avslöjas.
XmlSecureResolver Använd för att begränsa de resurser som XmlTextReader kan komma åt.
Tillåt XmlReader inte att externa resurser öppnas genom att ange XmlResolver egenskapen till null.
Kontrollera att egenskapen DataViewManager.DataViewSettingCollectionString har tilldelats från en betrodd källa.
.NET Framework 3.5 och tidigare
Inaktivera DTD-bearbetning om du hanterar ej betrodda källor genom att ange ProhibitDtd egenskapen till true.
XmlTextReader-klassen har ett fullständigt krav på förtroende på arv.
.NET Framework 4 och senare
Undvik att aktivera DtdProcessing om du har att göra med ej betrodda källor genom att ange XmlReaderSettings.DtdProcessing egenskapen till Tillåt eller Ignorera.
Kontrollera att metoden Load() tar en XmlReader-instans i alla InnerXml-fall.
Kommentar
Den här regeln kan rapportera falska positiva identifieringar på vissa giltiga XmlSecureResolver-instanser.
När du ska ignorera varningar
Om du inte är säker på att indata är kända för att komma från en betrodd källa ska du inte utelämna en regel från den här varningen.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA3075
// The code that's violating the rule is on this line.
#pragma warning restore CA3075
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA3075.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel på pseudokod
Överträdelse 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;
}
}
}
Lösning 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;
}
}
}
Överträdelse 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
}
}
}
Lösning 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);
}
}
}
Överträdelse 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
}
}
}
Lösning 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);
}
Överträdelse 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
}
}
}
Lösning 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 );
}
}
}
Överträdelse 5
using System.Xml;
using System.Xml.XPath;
namespace TestNamespace
{
public class UseXmlReaderForXPathDocument
{
public void TestMethod(string path)
{
XPathDocument doc = new XPathDocument(path); // warn
}
}
}
Lösning 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);
}
}
}
Överträdelse 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
}
}
Lösning 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
}
}
Överträdelse 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 {}
}
}
}
Lösning 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);
}
}
}
Kommentar
Även om XmlReader.Create är det rekommenderade sättet att skapa en XmlReader instans finns det beteendeskillnader från XmlTextReader. En XmlReader från Create normaliserar \r\n
till \n
i XML-värden, samtidigt XmlTextReader som sekvensen \r\n
bevaras.