CA3075: Niezabezpieczone przetwarzanie definicji DTD
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA3075 |
Tytuł | Niezabezpieczone przetwarzanie definicji DTD |
Kategoria | Bezpieczeństwo |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Jeśli używasz niezabezpieczonych DtdProcessing wystąpień lub odwołujesz się do źródeł jednostek zewnętrznych, analizator może zaakceptować niezaufane dane wejściowe i ujawnić poufne informacje osobom atakującym.
Opis reguły
Definicja typu dokumentu (DTD) jest jednym z dwóch sposobów, w jaki analizator XML może określić ważność dokumentu, zgodnie z definicją w extensible Markup Language (XML) World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0. Ta reguła szuka właściwości i wystąpień, w których akceptowane są niezaufane dane, aby ostrzegać deweloperów przed potencjalnymi zagrożeniami dotyczącymi ujawniania informacji lub atakami typu "odmowa usługi" (DoS ). Ta reguła jest wyzwalana, gdy:
Funkcja DtdProcessing jest włączona w wystąpieniu XmlReader , co rozwiązuje zewnętrzne jednostki XML przy użyciu polecenia XmlUrlResolver.
Właściwość InnerXml w pliku XML jest ustawiona.
DtdProcessing właściwość jest ustawiona na Parse.
Niezaufane dane wejściowe są przetwarzane przy użyciu XmlResolver zamiast XmlSecureResolver.
Metoda XmlReader.Create jest wywoływana z niezabezpieczonym XmlReaderSettings wystąpieniem lub żadnym wystąpieniem.
XmlReader jest tworzony z niezabezpieczonymi ustawieniami domyślnymi lub wartościami.
W każdym z tych przypadków wynik jest taki sam: zawartość z systemu plików lub udziałów sieciowych z maszyny, na której jest przetwarzany kod XML, będzie widoczna dla osoby atakującej lub przetwarzanie DTD może być używane jako wektor doS.
Jak naprawić naruszenia
Przechwyć i przetworzyć wszystkie wyjątki XmlTextReader prawidłowo, aby uniknąć ujawnienia informacji o ścieżce.
Użyj elementu , XmlSecureResolver aby ograniczyć zasoby, do których może uzyskiwać dostęp xmlTextReader.
Nie zezwalaj na XmlReader otwieranie żadnych zasobów zewnętrznych przez ustawienie XmlResolver właściwości na null.
Upewnij się, że właściwość jest przypisana DataViewManager.DataViewSettingCollectionString z zaufanego źródła.
.NET Framework 3.5 i starsze wersje
Wyłącz przetwarzanie DTD, jeśli masz do czynienia z niezaufanymi źródłami, ustawiając ProhibitDtd właściwość na true.
Klasa XmlTextReader ma pełne zapotrzebowanie na dziedziczenie zaufania.
.NET Framework 4 lub nowszy
Unikaj włączania funkcji DtdProcessing, jeśli masz do czynienia z niezaufanymi źródłami, ustawiając właściwość na XmlReaderSettings.DtdProcessing Wartość Zakaz lub Ignoruj.
Upewnij się, że metoda Load() przyjmuje wystąpienie XmlReader we wszystkich przypadkach InnerXml.
Uwaga
Ta reguła może zgłaszać wyniki fałszywie dodatnie w niektórych prawidłowych wystąpieniach xmlSecureResolver.
Kiedy pomijać ostrzeżenia
Jeśli nie masz pewności, że dane wejściowe są znane z zaufanego źródła, nie pomijaj reguły z tego ostrzeżenia.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA3075
// The code that's violating the rule is on this line.
#pragma warning restore CA3075
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA3075.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykłady przykładów kodu przykładowego
Naruszenie 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;
}
}
}
Rozwiązanie 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;
}
}
}
Naruszenie 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
}
}
}
Rozwiązanie 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);
}
}
}
Naruszenie 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
}
}
}
Rozwiązanie 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);
}
Naruszenie 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
}
}
}
Rozwiązanie 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 );
}
}
}
Naruszenie 5
using System.Xml;
using System.Xml.XPath;
namespace TestNamespace
{
public class UseXmlReaderForXPathDocument
{
public void TestMethod(string path)
{
XPathDocument doc = new XPathDocument(path); // warn
}
}
}
Rozwiązanie 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);
}
}
}
Naruszenie 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
}
}
Rozwiązanie 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
}
}
Naruszenie 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 {}
}
}
}
Rozwiązanie 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);
}
}
}
Uwaga
Chociaż XmlReader.Create jest to zalecany sposób tworzenia XmlReader wystąpienia, istnieją różnice w zachowaniu z XmlTextReaderklasy . Element XmlReader z Create normalizacji do \n
w wartościach \r\n
XML, zachowując XmlTextReader \r\n
sekwencję.