Bagikan melalui


CA3075: Pemrosesan DTD Tidak Aman

Properti Nilai
ID Aturan CA3075
Judul Pemrosesan DTD tidak aman
Golongan Keamanan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

Penyebab

Jika Anda menggunakan instans yang tidak aman DtdProcessing atau mereferensikan sumber entitas eksternal, pengurai dapat menerima input yang tidak tepercaya dan mengungkapkan informasi sensitif kepada penyerang.

Deskripsi aturan

Definisi Tipe Dokumen (DTD) adalah salah satu dari dua cara pengurai XML dapat menentukan validitas dokumen, seperti yang didefinisikan oleh World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0. Aturan ini mencari properti dan instans di mana data yang tidak tepercaya diterima untuk memperingatkan pengembang tentang potensi ancaman Pengungkapan Informasi atau serangan Penolakan Layanan (DoS). Aturan ini memicu ketika:

Dalam setiap kasus ini, hasilnya sama: konten dari sistem file atau berbagi jaringan dari mesin tempat XML diproses akan diekspos ke penyerang, atau pemrosesan DTD dapat digunakan sebagai vektor DoS.

Cara memperbaiki pelanggaran

  • Tangkap dan proses semua pengecualian XmlTextReader dengan benar untuk menghindari pengungkapan informasi jalur.

  • XmlSecureResolver Gunakan untuk membatasi sumber daya yang dapat diakses XmlTextReader.

  • Jangan izinkan XmlReader untuk membuka sumber daya eksternal apa pun dengan mengatur XmlResolver properti ke null.

  • Pastikan bahwa DataViewManager.DataViewSettingCollectionString properti ditetapkan dari sumber tepercaya.

.NET Framework 3.5 dan yang lebih lama

  • Nonaktifkan pemrosesan DTD jika Anda berurusan dengan sumber yang tidak tepercaya dengan mengatur ProhibitDtd properti ke true.

  • Kelas XmlTextReader memiliki permintaan warisan kepercayaan penuh.

.NET Framework 4 dan yang lebih baru

  • Hindari mengaktifkan DtdProcessing jika Anda berurusan dengan sumber yang tidak tepercaya dengan mengatur XmlReaderSettings.DtdProcessing properti ke Dilarang atau Abaikan.

  • Pastikan bahwa metode Load() mengambil instans XmlReader dalam semua kasus InnerXml.

Catatan

Aturan ini mungkin melaporkan positif palsu pada beberapa instans XmlSecureResolver yang valid.

Kapan harus menekan peringatan

Kecuali Anda yakin bahwa input diketahui dari sumber tepercaya, jangan menekan aturan dari peringatan ini.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

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

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh kode semu

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

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

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

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

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

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

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

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

Pelanggaran 5

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

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

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

Pelanggaran 6

using System.Xml;

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

Solusi 6

using System.Xml;

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

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

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

Catatan

Meskipun XmlReader.Create adalah cara yang disarankan untuk membuat XmlReader instans, ada perbedaan perilaku dari XmlTextReader. XmlReader Dari Create normalisasi \r\n ke \n dalam nilai XML, sambil XmlTextReader mempertahankan \r\n urutannya.