CA3075:不安全的 DTD 處理
屬性 | 值 |
---|---|
規則識別碼 | CA3075 |
標題 | 不安全的 DTD 處理 |
類別 | 安全性 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 8 中啟用 | No |
原因
如果您使用不安全的 DtdProcessing 執行個體或參考外部實體來源,剖析器可能會接受未受信任的輸入,而將機密資訊洩漏給攻擊者。
檔案描述
文件類型定義 (DTD) 是 World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0中針對 XML 剖析器用來判斷文件有效性所定義之兩種方式的其中一種。 此規則會尋找接受不受信任數據的屬性和實例,以警告開發人員潛在的 資訊洩漏 威脅或 阻斷服務 (DoS) 攻擊。 下列情況會觸發此規則:
XmlReader 執行個體上已啟用 DtdProcessing,它會使用 XmlUrlResolver解析外部 XML 項目。
XML 中有設定 InnerXml 屬性。
DtdProcessing 屬性設定為 Parse。
使用 XmlResolver 來處理未受信任的輸入,而不是 XmlSecureResolver 。
使用 XmlReader.Create 不安全 XmlReaderSettings 的實例或完全沒有實例來叫用 方法。
XmlReader 會使用不安全的預設設定或值來建立。
在上述每個案例中,結果都相同:來自文件系統或網路共享的內容會從處理 XML 的電腦公開給攻擊者,或 DTD 處理可用來做為 DoS 向量。
如何修正違規
正確攔截並處理所有 XmlTextReader 例外狀況,以避免路徑資訊洩漏。
使用 XmlSecureResolver 來限制 XmlTextReader 可以存取的資源。
藉由將 XmlReader 屬性設為 XmlResolver null ,來禁止開啟外部資源。
請確定 DataViewManager.DataViewSettingCollectionString 屬性是從信任的來源指派。
.NET Framework 3.5 和更早版本
如果您正在處理不受信任的來源,請將 ProhibitDtd 屬性設為 true 以停用 DTD 處理。
XmlTextReader 類別具有完全信任的繼承要求。
.NET Framework 4 和更新版本
如果您正在處理不受信任的來源,請藉由將 XmlReaderSettings.DtdProcessing 屬性設定為 [禁止] 或 [忽略] 來避免啟用 DtdProcessing。
請確認在所有 InnerXml 案例中 Load() 方法皆會使用 XmlReader 執行個體。
注意
此規則可能會在一些有效的 XmlSecureResolver 執行個體上出現誤判報告。
隱藏警告的時機
如果您無法確定輸入是否來自受信任的來源,請不要隱藏這個警告的規則。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#pragma warning disable CA3075
// The code that's violating the rule is on this line.
#pragma warning restore CA3075
若要停用檔案、資料夾或項目的規則,請在組態檔中將其嚴重性設定為 。none
[*.{cs,vb}]
dotnet_diagnostic.CA3075.severity = none
如需詳細資訊,請參閱 如何隱藏程式代碼分析警告。
虛擬程式代碼範例
違規 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
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;
}
}
}
違規 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
}
}
}
解決方案 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);
}
}
}
違規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
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);
}
違規 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
}
}
}
解決方案 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 );
}
}
}
違規5
using System.Xml;
using System.Xml.XPath;
namespace TestNamespace
{
public class UseXmlReaderForXPathDocument
{
public void TestMethod(string path)
{
XPathDocument doc = new XPathDocument(path); // warn
}
}
}
解決方案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);
}
}
}
違規 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = new XmlUrlResolver() };
}
}
解決方案 6
using System.Xml;
namespace TestNamespace
{
class TestClass
{
public XmlDocument doc = new XmlDocument() { XmlResolver = null }; // or set to a XmlSecureResolver instance
}
}
違規 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 {}
}
}
}
解決方案 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);
}
}
}
注意
雖然 XmlReader.Create 是建立 XmlReader 實例的建議方式,但與 有行為差異 XmlTextReader。 XmlReader,從 Create 正規化\r\n
為 \n
XML 值,同時XmlTextReader保留\r\n
序列。