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

How to configure the XML parser to disable external entity resolution in c#

var xDoc = XDocument.Load(fileName);

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

描述

该产品处理一个 XML 文档,该文档可以包含 XML 个具有解析为外部文档的 URL 的实体 预期的控制范围,导致产品将不正确的文档嵌入到其输出中。默认情况下, XML 实体解析器将尝试解析和检索外部引用。如果攻击者控制 XML 可以 提交给这些功能之一,然后攻击者可以获得有关内部网络、本地信息的访问权限 文件系统或其他敏感数据。这被称为 XML 外部实体 (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 来禁用解析器,来自 How to prevent XXE attack ( XmlDocument in .net)

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

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

根据 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

你可以这样试试:

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, "");