【问题标题】: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 就足以解决这个问题了?

标签: c# .net xml veracode


【解决方案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 的解决方案解决了这个问题。导致半可信软件不支持。
        猜你喜欢
        • 2018-02-28
        • 2019-10-07
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多