Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
| 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örhető |
| Alapértelmezés szerint engedélyezve a .NET 10-ben | Nem |
| Alkalmazandó nyelvek | C# és Visual Basic |
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:
A DtdProcessing engedélyezve van a XmlReader példányon, amely a külső XML-entitásokat a XmlUrlResolver használatával oldja fel.
Az InnerXml XML-tulajdonság be van állítva.
A DtdProcessing tulajdonság Parse értékre van állítva.
A nem megbízható bemenetek feldolgozása XmlResolver helyett XmlSecureResolver.
A XmlReader.Create metódus meghívása nem biztonságos XmlReaderSettings példánysal történik, vagy egyáltalán nincs példány.
XmlReader nem biztonságos alapértelmezett beállításokkal vagy értékekkel jön létre.
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
Ha nem megbízható forrásokkal dolgozik, kapcsolja ki a DTD-feldolgozást a ProhibitDtd tulajdonság true é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.
Feljegyzé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);
}
}
}
Feljegyzés
Bár a XmlReader.Create a XmlReader példány létrehozásának ajánlott módja, viselkedésében eltér a XmlTextReader-től. Az XmlReader normalizálja Create az XML-értékeket \r\n\n, miközben XmlTextReader megőrzi a \r\n sorozatot.