2012-12-06 1 views
4

<cfxml>을 사용하여 xml 개체를 만들려고합니다. 모든 데이터 형식을 XMLFormat()으로 지정했습니다. XML에 '»'과 같은 일부 잘못된 문자가 있습니다. 나는이 다음과 같은 XML의 문서 타입에가 문자 추가 :ColdFusion : 잘못된 XML 컨트롤 Char (16 진수)

<!ENTITY raquo "»"> 

HTML 텍스트가 잘 포맷되지 않은,하지만 대부분의 내 코드와 함께 작동합니다. 그러나 일부 텍스트에는 일부 제어 문자가 있습니다. 다음 오류가 나타납니다.

문서의 요소 내용에 잘못된 XML 문자 (유니 코드 : 0x13)가 있습니다.

나는 doctype에 유니 코드를 추가하려고 시도했으며 이것을 시도했습니다. solution. 둘 다 작동하지 않았습니다 ...

답변

0

» 대신 &#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#"> 
+0

당신이 내 질문에 대해 잘못 이해했습니다. '»'는 그저 하나의 예제 일뿐입니다. 필요한 것은 0x13 코드입니다. 예 : & # 013 (존재하는 경우)와 같이 보일 것입니다 ... – Toby

-1

이 방법으로 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(); 
} 
+0

그 코드는 유효한 CFML이 아닙니다. –

+0

나는 동의하지만, CF가 아니지만 솔루션은 JAVA에서 해결책을 제시하고있다. XMLFormat은 최소한의 정리 작업 만하므로, 결과적으로 find 나 regex를 사용하여 루핑하여 모든 이상한 ASCII 문자를 필터링해야한다. –

2

여기 정리 유효한 CFScript의 코드가 있다고 할 아래의 방법을 수정할 수 있습니다 입력에 보낼 수 있습니다 우리의 XML에는 더 높은 국제 문자를 지우는 방법과 XML을 깨는 더 낮은 ASCII 문자만을 지우는 방법 두 가지가 있습니다. 더 많은 문자를 찾으면 필터 규칙 만 확장하면됩니다. 또는 OWASP 사이트 https://www.owasp.org/index.php/ESAPI_Overview에서 오래된 CF에 ESAPI 단지를 추가 직접 CF10 함께 제공

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

또는 사용 ESAPI :

<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> 

다른 posisbilty 사용자 CF10의 funciton의 encodeForXML()이다

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