ColdFusion:无效的 XML 控制字符(十六进制)

Posted

技术标签:

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

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

<!ENTITY raquo "»">

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

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

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

【问题讨论】:

【参考方案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 或正则表达式。

以上是关于ColdFusion:无效的 XML 控制字符(十六进制)的主要内容,如果未能解决你的问题,请参考以下文章

简单的 ColdFusion 脚本在 IE 中有效,但在 Firefox 中无效?

如何解析节点名称中包含无效字符的 XML?

在 ColdFusion 中显示和/或使用无效的表单字段,如果您只是尝试用磅符号包装它们

ColdFusion CFFILE 重命名属性验证错误,属性源的值无效,即使文件存在且路径正确

ColdFusion 2018和三个Char夏令时代码的BlazeDS DateTime解析错误

解析Xml数据错误:文本内容中发现无效字符怎么处理