修复“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外部实体引用的不当限制”的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

等待 GPS 定位修复的最佳方式是啥?

我想知道使用 Sonar 的最佳方法是啥?

安卓x5内核加载失败怎么办 导致失败的原因是啥呢

对 XML 模式进行版本控制的最佳实践是啥?

查找有关 PHP、Zend 框架、JavaScript 安全问题的新闻的最佳来源是啥

从 Django 0.96 升级到 1.0 的最佳方式是啥?