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

MAN*_*ARY 9 c# veracode

var xDoc = XDocument.Load(fileName);
Run Code Online (Sandbox Code Playgroud)

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

描述

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

建议

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

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

Cas*_*sey 9

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

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(OurOutputXMLString);
Run Code Online (Sandbox Code Playgroud)

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


Gyö*_*zeg 6

实现自定义XmlResolver并将其用于读取 XML。默认情况下,XmlUrlResolver使用 ,它会自动下载解析的引用。

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

并像这样使用它:

var settings = new XmlReaderSettings { XmlResolver = new CustomResolver() };
var reader = XmlReader.Create(fileName, settings);
var xDoc = XDocument.Load(reader);
Run Code Online (Sandbox Code Playgroud)