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