2015-08-25 53 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); 

如果您希望文档包含实体引用,那么您将需要创建一个自定义解析器,并将您期望的内容列入白名单。 特别是,任何对您不控制的网站的引用。