CA3075: Güvensiz DTD İşleme

Özellik Değer
Kural Kimliği CA3075
Başlık Güvensiz DTD İşleme
Kategori Güvenlik
Düzeltme bozucu veya bozucu olmayan bir etkisi olabilir Kaydırmaz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

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:

  • DtdProcessing, dış XML varlıklarını XmlReader kullanarak çözen örnek üzerinde etkinleştirilmiştir XmlUrlResolver.

  • InnerXml XML'deki özelliği ayarlanır.

  • DtdProcessing özelliği Ayrıştır olarak ayarlanır.

  • Güvenilmeyen giriş, yerine kullanılarak işlenir.

  • XmlReader.Create yöntemi, güvenli olmayan XmlReaderSettings bir örnekle veya hiç örnek olmadan çağrılır.

  • XmlReader güvenli olmayan varsayılan ayarlar veya değerlerle oluşturulur.

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.

  • "XmlReader herhangi bir harici kaynağı açmasına izin vermemek için, XmlResolver özelliğini null olarak ayarlayın."

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

.NET Framework 3.5 ve öncesi

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

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

.NET Framework 4 ve üzeri

  • Güvenilmeyen kaynaklarla ilgileniyorsanız, özelliğini XmlReaderSettings.DtdProcessing veya Yoksay olarak ayarlayarak 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 noneolarak 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

XmlReader.Create önerilen yöntem olsa da, bir XmlReader örneği oluşturmak ile XmlTextReader arasındaki davranış farklılıkları vardır. XmlReader XML değerlerini Create'e, \r\n\n olarak normalleştirir, ancak XmlTextReader\r\n dizisini korur.