修复“xml外部实体引用的不当限制”的最佳方法是啥?
Posted
技术标签:
【中文标题】修复“xml外部实体引用的不当限制”的最佳方法是啥?【英文标题】:What is the best way to fix "Improper Restriction of xml external entity reference"?修复“xml外部实体引用的不当限制”的最佳方法是什么? 【发布时间】:2014-03-23 04:20:53 【问题描述】:我们最近运行的 VeraCode 指出了以下方法:
public XmlElement RunProcedureXmlElement(string Procedure, List<SqlParameter> Parameters)
DataSet ds = RunProcedureDataSet(Procedure, Parameters);
XmlDocument xmlDoc = new XmlDocument();
StringBuilder strXML = new StringBuilder();
foreach (DataTable dt in ds.Tables)
foreach (DataRow dr in dt.Rows)
strXML.Append(dr[0]); // Do I still need .ToString()???
if (strXML.Length == 0) strXML.Append("<root total=\"0\"></root>");
try
xmlDoc.LoadXml(strXML.ToString());
catch (XmlException e)
return xmlDoc.DocumentElement;
什么是修复该方法的好解决方案,以便 VeraCode 停止抱怨?
谢谢
【问题讨论】:
这是 C#,对吧?适当地标记会很有帮助,因为解决这个问题(通过禁止文档提供自己的 DTD)需要了解平台的 XML API。 啊——我看到你已经禁止 DTD 处理了。那么,听起来像是 VeraCode 中的一个错误;我会把它带给他们。 我放了 DtdProcessing.Prohibit 来修复它。我以前没有。所以,VeraCode 没有问题。 VeraCode 指向我的方法开始的那一行。我想知道您是否知道 VeraCode 可以抱怨此方法中的哪一行?是我附加“”的地方吗?如果是,我可以替换它吗?或者它只是因为我没有处理 TD 处理而抱怨? 作为客户,您可以像公司以外的任何人一样访问文档——但是如果我正在编写一个静态分析器来寻找这个特定的问题,我会寻找Load()
和 LoadXml()
调用来触发此特定分析。
谢谢查尔斯。那么,基本上,放置 DtdProcessing.Prohibit 就足以解决这个问题了?
【参考方案1】:
经过一番研究,这段代码应该可以修复它:
using (System.IO.MemoryStream stream = new System.IO.MemoryStream (Encoding.Default.GetBytes(strXML.ToString())))
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
using (XmlReader reader = XmlReader.Create(stream, settings))
try
xmlDoc.Load(reader);
catch(XmlException e)
【讨论】:
【参考方案2】:我在使用 Veracode 时也遇到了同样的问题,以下解决了它。
声明XmlReader
后:
XmlDocument xmlDoc = new XmlDocument();
添加行:
xmlDoc.XmlResolver = null;
【讨论】:
【参考方案3】:我用下面的例子来解决这个问题
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(strXML.ToString());
【讨论】:
【参考方案4】:根据 VS2017 IDE 建议,您可以通过以下方式进行更正:
XmlDocument xmlDoc = new XmlDocument XmlResolver = null ;
【讨论】:
最后,我用 David 的解决方案解决了这个问题。导致半可信软件不支持。以上是关于修复“xml外部实体引用的不当限制”的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章