Megosztás a következőn keresztül:


CA3075: Nem biztonságos DTD-feldolgozás

Tulajdonság Érték
Szabályazonosító CA3075
Cím Nem biztonságos DTD-feldolgozás
Kategória Biztonság
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Ok

Ha nem biztonságos DtdProcessing példányokat használ, vagy külső entitásforrásokra hivatkozik, az elemző elfogadhatja a nem megbízható bemeneteket, és bizalmas információkat tehet közzé a támadók számára.

Szabály leírása

A dokumentumtípus-definíció (DTD) egyike annak a két módszernek, amelyekkel az XML-elemzők meghatározhatják egy dokumentum érvényességét a World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0 által meghatározottak szerint. Ez a szabály olyan tulajdonságokat és példányokat keres, amelyek nem megbízható adatokat fogadnak el, hogy figyelmeztessék a fejlesztőket az esetleges információfeltárási fenyegetésekre vagy a Szolgáltatásmegtagadási (DoS) támadásokra. Ez a szabály a következő esetekben aktiválódik:

Minden ilyen esetben az eredmény ugyanaz: az XML-t feldolgozó gép fájlrendszeréből vagy hálózati megosztásaiból származó tartalom ki lesz téve a támadónak, vagy a DTD-feldolgozás használható DoS-vektorként.

Szabálysértések kijavítása

  • Az útvonaladatok felfedésének elkerülése érdekében az XmlTextReader-kivételek helyes elfogása és feldolgozása.

  • XmlSecureResolver Ezzel korlátozhatja az XmlTextReader által elérhető erőforrásokat.

  • Ne engedélyezze a XmlReader külső erőforrások megnyitását a XmlResolver tulajdonság null értékre állításával.

  • Győződjön meg arról, hogy a DataViewManager.DataViewSettingCollectionString tulajdonság megbízható forrásból van hozzárendelve.

.NET-keretrendszer 3.5-ös és korábbi verziók

  • Tiltsa le a DTD-feldolgozást, ha nem megbízható forrásokkal foglalkozik a ProhibitDtd tulajdonság igaz értékre állításával.

  • Az XmlTextReader osztály teljes megbízhatósági öröklési igénysel rendelkezik.

4-.NET-keretrendszer és újabb verziók

  • Ne engedélyezze a DtdProcessing használatát, ha nem megbízható forrásokkal foglalkozik, ha a XmlReaderSettings.DtdProcessing tulajdonságot Tiltás vagy Mellőzés értékre állítja.

  • Győződjön meg arról, hogy a Load() metódus minden InnerXml-esetben xmlReader-példányt használ.

Megjegyzés:

Ez a szabály hamis pozitív értékeket jelenthet néhány érvényes XmlSecureResolver-példányon.

Mikor kell letiltani a figyelmeztetéseket?

Hacsak nem biztos abban, hogy a bemenet megbízható forrásból származik, ne tiltsa le a figyelmeztetés egyik szabályát sem.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA3075
// The code that's violating the rule is on this line.
#pragma warning restore CA3075

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA3075.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

Példák pszeudokódokra

Szabálysértés 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;
        }
    }
}

1\. megoldás

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;
        }
    }
}

2. szabálysértés

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
        }
    }
}

2\. megoldás

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);
        }
    }
}

Szabálysértés 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
        }
    }
}

3\. megoldás

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);
}

Szabálysértés 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
        }
    }
}

4. megoldás

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 );
        }
    }
}

Szabálysértés 5

using System.Xml;
using System.Xml.XPath;

namespace TestNamespace
{
    public class UseXmlReaderForXPathDocument
    {
        public void TestMethod(string path)
        {
            XPathDocument doc = new XPathDocument(path); // warn
        }
    }
}

5. megoldás

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);
        }
    }
}

6. szabálysértés

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
    }
}

6. megoldás

using System.Xml;

namespace TestNamespace
{
    class TestClass
    {
        public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
    }
}

Szabálysértés 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 {}
        }
    }
}

7. megoldás

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);
        }
    }
}

Megjegyzés:

Bár XmlReader.Create a példányok létrehozásának XmlReader ajánlott módja, a példányok viselkedése eltér a következőtől XmlTextReader: . Az an XmlReader normalizálja Create az \n XML-értékeket\r\n, miközben XmlTextReader megőrzi a \r\n sorozatot.