C# 解决问题的最佳方法是什么;xml外部实体引用的限制不正确;?
我们最近运行的代码指出了以下方法:C# 解决问题的最佳方法是什么;xml外部实体引用的限制不正确;?,c#,.net,xml,veracode,C#,.net,Xml,Veracode,我们最近运行的代码指出了以下方法: public XmlElement RunProcedureXmlElement(string Procedure, List<SqlParameter> Parameters) { DataSet ds = RunProcedureDataSet(Procedure, Parameters); XmlDocument xmlDoc = new XmlDocument(); Strin
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;
}
公共XmlElement RunProcedureXmlElement(字符串过程,列表参数)
{
数据集ds=运行过程数据集(过程、参数);
XmlDocument xmlDoc=新的XmlDocument();
StringBuilder strXML=新的StringBuilder();
foreach(ds.表中的数据表dt)
{
foreach(数据行dr在dt.行中)
{
strXML.Append(dr[0]);//我是否仍然需要.ToString()???
}
}
如果(strXML.Length==0)strXML.Append(“”);
尝试
{
LoadXml(strXML.ToString());
}
捕获(XMLE异常)
{
}
返回xmlDoc.DocumentElement;
}
有什么好的解决方案可以修复该方法,使VeraCode停止抱怨
Thank's在做了一些研究之后,这段代码应该可以修复它:
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)
{
}
}
}
我对Veracode也有同样的问题,下面解决了它。
声明
XmlReader
后:
XmlDocument xmlDoc = new XmlDocument();
添加行:
xmlDoc.XmlResolver = null;
我用下面的例子来解决这个问题
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(strXML.ToString());
从VS2017 IDE建议中,您可以通过以下方式更正它:
XmlDocument xmlDoc=newxmldocument{xmlsolver=null};
这是C#,对吗?适当地标记会很有帮助,因为解决这个问题(通过禁止文档提供自己的DTD)需要了解平台的XML API。啊-我知道您已经禁止了DTD处理。听起来像是VeraCode中的一个bug;我会把它交给他们。我把DTD处理。禁止以修复它。我以前没有。所以,VeraCode没有问题。VeraCode指向我的方法开始的那一行。我想知道你是否知道VeraCode会抱怨这个方法中的哪一行?它是我附加“”的地方吗?如果是,我可以替换它吗?或者它只是因为我没有处理TD处理而抱怨?作为一个客户,您可以像公司以外的任何人一样访问文档——但是如果我编写一个静态分析器来查找这个特定问题,那么它将是Load()
和LoadXml()
我将寻找触发此特定分析的调用。感谢Charles。所以,基本上,使用DTD处理。禁止就足以解决这个问题了?最后,我用David的解决方案解决了这个问题。导致半信任软件不受支持。