Aracılığıyla paylaş


CA3075: Güvensiz DTD İşleme

Özellik Değer
Kural Kimliği CA3075
Başlık Güvensiz DTD İşleme
Kategori Güvenlik
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 9'da varsayılan olarak etkin Hayır

Neden

Güvenli olmayan DtdProcessing örnekler kullanıyorsanız veya dış varlık kaynaklarına başvurursanız, ayrıştırıcı güvenilmeyen girişleri kabul edebilir ve hassas bilgileri saldırganlara ifşa edebilir.

Kural açıklaması

Belge Türü Tanımı (DTD), XML ayrıştırıcısının World Wide Web Consortium (W3C) Genişletilebilir Biçimlendirme Dili (XML) 1.0 tarafından tanımlandığı şekilde belgenin geçerliliğini belirlemesinin iki yoludur. Bu kural, geliştiricileri olası Bilgilerin Açığa Çıkması tehditleri veya Hizmet Reddi (DoS) saldırıları konusunda uyarmak için güvenilmeyen verilerin kabul edildiği özellikleri ve örnekleri arar. Bu kural şu durumlarda tetikler:

Bu durumların her birinde sonuç aynıdır: XML'nin işlendiği makinedeki dosya sisteminden veya ağ paylaşımlarından gelen içerik saldırgana gösterilir veya DTD işleme bir DoS vektörü olarak kullanılabilir.

İhlalleri düzeltme

  • Yol bilgilerinin açığa çıkmasını önlemek için tüm XmlTextReader özel durumlarını yakalayın ve işleyin.

  • XmlTextReader'ın erişebileceği kaynakları kısıtlamak için öğesini XmlSecureResolver kullanın.

  • özelliğini null olarak ayarlayarak öğesinin dış kaynakları açmasına XmlResolver izin XmlReader verme.

  • Özelliğin DataViewManager.DataViewSettingCollectionString güvenilir bir kaynaktan atandığından emin olun.

.NET Framework 3.5 ve öncesi

  • Özelliği true olarak ayarlayarak güvenilmeyen kaynaklarla ilgileniyorsanız DTD işlemeyi ProhibitDtd devre dışı bırakın.

  • XmlTextReader sınıfı tam güven devralma talebine sahiptir.

.NET Framework 4 ve üzeri

  • Güvenilmeyen kaynaklarla ilgileniyorsanız, özelliğini Yasakla veya Yoksay olarak ayarlayarak XmlReaderSettings.DtdProcessing DtdProcessing'i etkinleştirmekten kaçının.

  • Load() yönteminin tüm InnerXml olaylarında bir XmlReader örneği aldığından emin olun.

Not

Bu kural bazı geçerli XmlSecureResolver örneklerinde hatalı pozitifler bildirebilir.

Uyarıların ne zaman bastırılması gerekiyor?

Girişin güvenilir bir kaynaktan geldiğinin bilindiğinden emin değilseniz, bu uyarıdan bir kuralı gizlemeyin.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

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

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none olarak ayarlayın.

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

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Sahte kod örnekleri

İhlal 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\. Çözüm

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

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

Çözüm 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);
        }
    }
}

İhlal 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\. Çözüm

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

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

Çözüm 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 );
        }
    }
}

İhlal 5

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

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

Çözüm 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);
        }
    }
}

İhlal 6

using System.Xml;

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

Çözüm 6

using System.Xml;

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

İhlal 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 {}
        }
    }
}

Çözüm 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);
        }
    }
}

Not

Örnek oluşturmanın XmlReader önerilen yolu olsa XmlReader.Create da, ile arasındaki davranış farklılıkları XmlTextReadervardır. bir XmlReader değeri Create XML değerlerinde normalleştirir \r\n \n , ancak XmlTextReader diziyi \r\n korur.