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:
DtdProcessing diaktifkan pada XmlReader instans, yang menyelesaikan entitas XML eksternal menggunakan XmlUrlResolver.
Properti InnerXml dalam XML diatur.
DtdProcessing properti diatur ke Uraikan.
Input yang tidak tepercaya diproses menggunakan XmlResolver alih-alih XmlSecureResolver.
Metode XmlReader.Create ini dipanggil dengan instans yang tidak aman XmlReaderSettings atau tidak ada instans sama sekali.
XmlReader dibuat dengan pengaturan atau nilai default yang tidak aman.
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.