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:
DtdProcessing, dış XML varlıklarını kullanarak XmlUrlResolverçözümleyen örnekte etkinleştirilirXmlReader.
InnerXml XML'deki özelliği ayarlanır.
DtdProcessing özelliği Ayrıştır olarak ayarlanır.
Güvenilmeyen giriş yerine XmlSecureResolverkullanılarak XmlResolver 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.
ö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.