2015-08-25 51 views
6
var xDoc = XDocument.Load(fileName); 

我在函數中使用上述代碼來加載XML文件。功能明智的工作正常,但它顯示Veracode檢查後Veracode缺陷。如何配置XML解析器以禁用C中的外部實體解析#

說明

產品流程,可以包含XML實體解析爲外界控制的預期範圍的 文檔的URL,致使產品中嵌入不正確的文件到其輸出的XML文檔。默認情況下, XML實體解析器將嘗試解析和檢索外部引用。如果攻擊者控制的XML可以被提交到這些功能之一,則攻擊者可以訪問關於內部網絡,本地文件系統或其他敏感數據的信息。這被稱爲XML外部實體(XXE)攻擊。

建議

配置XML解析器來禁止外部實體解析。

我需要做些什麼來解決它。

回答

3

執行自定義XmlResolver並將其用於讀取XML。默認情況下,使用XmlUrlResolver,它自動下載已解析的引用。

public class CustomResolver : XmlUrlResolver 
{ 
    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) 
    { 
     // base calls XmlUrlResolver.DownloadManager.GetStream(...) here 
    } 
} 

而且使用這樣的:

var settings = new XmlReaderSettings { XmlResolver = new CustomResolver() }; 
var reader = XmlReader.Create(fileName, settings); 
var xDoc = XDocument.Load(reader); 
+1

我在windows項目中使用此代碼。它有什麼區別? –

+1

GetEntity()方法裏面有什麼? – gene

+0

@gene:通常你應該返回一個包含DTD或其他外部源的流。例如,如果您的文檔類型是這樣的<!DOCTYPE myxml SYSTEM「MyDTD.dtd」>',那麼'GetEntity'被調用'absoluteUri ==「MyDTD.dtd」',並且您應該返回一個流其內容。您可以簡單地返回一個空的DTD,這樣DTD中定義的實體將保持未解析狀態。 – taffer

6

如果你不使用你的XML外部實體引用,您可以將其設置爲null禁用解析器,從How to prevent XXE attack (XmlDocument in .net)

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.XmlResolver = null; 
xmlDoc.LoadXml(OurOutputXMLString); 

如果您希望文檔包含實體引用,那麼您將需要創建一個自定義解析器,並將您期望的內容列入白名單。 特別是,任何對您不控制的網站的引用。