CA3075: Niezabezpieczone przetwarzanie definicji DTD

Właściwości Wartość
Identyfikator reguły CA3075
Stanowisko Niezabezpieczone przetwarzanie definicji DTD
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 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:

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.DtdProcessingWartość 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ę.