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

时间:2015-08-25 11:39:56

标签: c# veracode

var xDoc = XDocument.Load(fileName);

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

描述

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

推荐

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

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

4 个答案:

答案 0 :(得分:7)

如果您没有在XML中使用外部实体引用,则可以通过将解析程序设置为空来禁用解析程序,从How to prevent XXE attack ( XmlDocument in .net)

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

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

答案 1 :(得分: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);

答案 2 :(得分:0)

根据OWASP官方文档,您需要执行以下操作:

使用XercesDOMParser可以防止XXE:

XercesDOMParser *parser = new XercesDOMParser;
parser->setCreateEntityReferenceNodes(false);

使用SAXParser,这样做是为了防止XXE:

SAXParser* parser = new SAXParser;
parser->setDisableDefaultEntityResolution(true);

使用SAX2XMLReader,这样做是为了防止XXE:

SAX2XMLReader* reader = XMLReaderFactory::createXMLReader();
parser->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true);

看看这些指南:https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html

答案 3 :(得分:0)

你可以试试这个:

XmlDocument doc = new XmlDocument() { XmlResolver = null };
System.IO.StringReader sreader = new System.IO.StringReader(fileName);
XmlReader reader = XmlReader.Create(sreader, new XmlReaderSettings() { XmlResolver = null });
doc.Load(reader);