20
var xDoc = XDocument.Load(fileName);

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

描述

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

建议

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

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

4

4 回答 4

19

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

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

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

于 2016-06-09T13:17:06.703 回答
6

实现一个自定义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);
于 2015-08-25T11:59:58.267 回答
2

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

于 2019-08-14T18:22:17.610 回答
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);
于 2021-05-19T05:09:33.903 回答