var xDoc = XDocument.Load(fileName);
我在函数中使用上面的代码来加载XML文件。功能明智的工作正常,但它显示Veracode检查后Veracode缺陷。
描述
该产品处理XML文档,该文档可以包含具有解析为外部文档的URL的XML实体 预期的控制范围,导致产品将不正确的文档嵌入其输出中。默认情况下 XML实体解析器将尝试解析和检索外部引用。如果受攻击者控制的XML可以 提交到这些功能之一,然后攻击者可以访问本地内部网络的信息 文件系统或其他敏感数据。这被称为XML eXternal Entity(XXE)攻击。
推荐
配置XML解析器以禁用外部实体解析。
我需要做些什么来解决它。
答案 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);