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

本文关键字:外部 实体 配置 XML | 更新日期: 2023-09-27 18:09:39

var xDoc = XDocument.Load(fileName);

我在一个函数中使用上述代码来加载XML文件。功能方面,它工作良好,但在Veracode检查后显示以下Veracode缺陷。

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

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

我需要做什么来解决它。

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

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

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

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

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

根据OWASP官方文档,您需要这样做:

使用XercesDOMParser来防止出现错误:

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

你可以这样尝试:

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);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// to be compliant, completely disable DOCTYPE declaration:
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// or completely disable external entities declarations:
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
// or prohibit the use of all protocols by external entities:
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");