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:
DtdProcessing je povolen v XmlReader instanci, která překládá externí xml entity pomocí XmlUrlResolver.
Vlastnost InnerXml v xml je nastavena.
DtdProcessing vlastnost je nastavena na Parse.
Nedůvěryhodný vstup se zpracovává místo XmlResolverXmlSecureResolver.
Metoda XmlReader.Create je vyvolána se nezabezpečenou XmlReaderSettings instancí nebo vůbec žádnou instancí.
XmlReader se vytvoří s nezabezpečeným výchozím nastavením nebo hodnotami.
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.