【问题标题】:ColdFusion: Invalid XML Control Char (hex)ColdFusion:无效的 XML 控制字符(十六进制)
【发布时间】:2012-11-24 12:58:03
【问题描述】:

我正在尝试使用 <cfxml> 创建一个 xml 对象。我用XMLFormat() 格式化了所有数据。 在 XML 中有一些无效字符,例如 '»'。我将此字符添加到 xml 文档类型中,如下所示:

<!ENTITY raquo "»">

HTML 文本的格式不是很好,但大部分都适用于我的代码。但在某些文本中有一些控制字符。我收到以下错误:

在文档的元素内容中发现了一个无效的 XML 字符(Unicode:0x13)。

我尝试将 unicode 添加到 doctype 中,并尝试了 solution。两者都没有工作......

【问题讨论】:

    标签: xml coldfusion char hex


    【解决方案1】:

    这是清理我们的 XML 的有效 cfscript 代码,有两种方法,一种清除较高的国际字符,另一种只清除破坏 XML 的较低 ASCII 字符,如果发现更多字符,只需扩展过滤规则即可。

    <cfscript>    
        function cleanHighAscii(text){
            var buffer = createObject("java", "java.lang.StringBuffer").init();
            var pattern = createObject("java", "java.util.regex.Pattern").compile(javaCast( "string", "[^\x00-\x7F]" ));
            var matcher = pattern.Matcher(javaCast( "string", text));
    
            while(matcher.find()){
                var value = matcher.group();
                var asciiValue = asc(value);
    
                if ((asciiValue == 8220) OR (asciiValue == 8221))
                    value = """";
                else if ((asciiValue == 8216) || (asciiValue == 8217))
                    value = "'";
                else if (asciiValue == 8230)
                    value = "...";
                else
                    value = "&###asciiValue#;";
    
                matcher.AppendReplacement(buffer, javaCast( "string", value ));
            }
    
            matcher.AppendTail(buffer);
            return buffer.ToString();
        }
    
        function removeSubAscii(text){
    
            return rereplaceNoCase(text, "\x1A","&###26#;", "all");
        }
    
        function XMLSafe(text){
            text = cleanHighAscii(text);
            text = removeSubAscii(text);
            return text;
        }
    </cfscript>
    

    其他可能性是用户 CF10 函数 encodeForXML():

    https://learn.adobe.com/wiki/display/coldfusionen/EncodeForXML

    或者直接使用 CF10 附带的 ESAPI,或者从 OWASP 站点 https://www.owasp.org/index.php/ESAPI_Overview 将 ESAPI jar 添加到您的旧 CF 中:

    var esapi = createObject("java", "org.owasp.esapi.ESAPI");
    var esapiEncoder = esapi.encoder();
    return esapiEncoder.encodeForXML(text);
    

    【讨论】:

      【解决方案2】:

      尝试使用&amp;#187; 而不是»。例如,这个 CFML:

      <cfxml variable="x"><?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE doc
      [
          <!ENTITY raquo "&#187;">
      ]>
      <doc>
          Hello, &raquo; !
      </doc>
      </cfxml>
      
      <cfdump var="#x#">
      

      【讨论】:

      • 你误解了我的问题。 » 只是一个例子(有效)。我需要的是 0x13 的代码...例如看起来像 的东西(如果存在的话)......
      【解决方案3】:

      通过此方法传递您的 XML 字符串,这将解决您的问题。

      它只允许在输入中发送有效字符,如果你想用其他字符替换无效字符,你可以修改下面的方法来做到这一点

      public String stripNonValidXMLCharacters(String in) {
          StringBuffer out = new StringBuffer(); // Used to hold the output.
          char current; // Used to reference the current character.
      
          if (in == null || ("".equals(in))) return ""; // vacancy test.
          for (int i = 0; i < in.length(); i++) {
              current = in.charAt(i);
              if ((current == 0x9) ||
                  (current == 0xA) ||
                  (current == 0xD) ||
                  ((current >= 0x20) && (current <= 0xD7FF)) ||
                  ((current >= 0xE000) && (current <= 0xFFFD)) ||
                  ((current >= 0x10000) && (current <= 0x10FFFF)))
                  out.append(current);
          }
          return out.toString();
      }  
      

      【讨论】:

      • 我同意,这不是 CF,但解决方案是 JAVA 中的解决方案 :) XMLFormat 只进行了最少的清理,所以最终你必须过滤掉所有奇怪的 ASCII 字符,通过循环,使用 find 或正则表达式。
      猜你喜欢
      • 2016-01-07
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 2012-06-17
      • 2016-11-14
      • 2016-03-30
      相关资源
      最近更新 更多