如何配置XML解析器以禁用c#中的外部实体解析

var xDoc = XDocument.Load(fileName); 

我在函数中使用上面的代码来加载XML文件。 function明智的工作正常,但它显示Veracode检查后Veracode缺陷。

描述

该产品处理XML文档,该文档可以包含带有URL的XML实体,这些URL可以解析为预期控制范围之外的文档,从而导致产品将不正确的文档嵌入其输出中。 默认情况下,XML实体解析程序将尝试解析和检索外部引用。 如果可以将攻击者控制的XML提交给其中一个function,则攻击者可以访问有关内部网络,本地文件系统或其他敏感数据的信息。 这称为XML eXternal Entity(XXE)攻击。

建议

配置XML解析器以禁用外部实体解析。

我需要做些什么来解决它。

实现自定义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); 

如果您没有在XML中使用外部实体引用,则可以通过将其设置为null来禁用解析程序, 如何防止XXE攻击(.net中的XmlDocument)

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

如果您希望文档包含实体引用,则需要创建自定义解析程序并将所需内容列入白名单。 特别是对您无法控制的网站的任何引用。