2011-08-02 6 views
3

<![CDATA[]]><![CDATA[ … ]]> 블록 내에 허용되지 않습니다. 그것은 이해할 수 있습니다.선호하는 방법은 무엇입니까? "<! [CDATA ["<! [CDATA [블록?

이제 사용자 입력 데이터를 <![CDATA[ … ]]> 블록 내에 전송해야합니다. 악의적 인 사용자는 <![CDATA[ 또는 ]]> 또는 둘 모두를 입력 할 수 있습니다.

질문 :이 상황을 처리하기 위해 선호되는 방법은 무엇입니까?

  • 스트립 <![CDATA[]]>?
  • 공백으로 바꾸시겠습니까?
  • 사용자에게 오류 메시지가 표시됩니까?
  • 실제로 전송하는 공식 방법이 있습니까?
+2

로 교체? 이미 많은 성숙한 것들이 있습니다. – Quentin

+0

@Quentin : 서버와 데스크탑에는 실제 작업에 필요한 충분한 라이브러리가 있습니다. 하지만 임베디드 시스템 (안드로이드)을 위해 개발했습니다. 그리고 거기에 필요한 libs 버전 2.2 이후에서만 사용할 수 있습니다. 그러나 우리는 고객에게 적어도 2.0 호환성을 약속했습니다. 하지만 저는 "진짜"프로그래머입니다. 직접 해보니 신경 쓰지 않아도됩니다. 대답이 받아 들여지지 않을 수도 있지만 때로는 대답이 "당신이 잘못하고 있습니다.이 대안을 시도하십시오"라고 받아 들일 수 있습니다. CDATA를 더 이상 사용하지 않고'<> & " '대신에 인코딩을 선택했습니다 – Martin

답변

2

잘못된 방식으로 CDATA 섹션을 생각하고 있다고 생각합니다. CDATA는 "문자 데이터"를 나타내고 CDATA 구문은 마크 업으로 해석되어서는 안되는 데이터 블록의 구문입니다. CDATA 섹션은 xml 문서를 다른 xml 문서에 포함시키는 데 유용하지만 문서에 문자 데이터 (예 : 텍스트)를 포함하는 경우 CDATA 섹션에 단순히 텍스트 데이터로 인코딩되는 경우 데이터의 의미를 변경해서는 안됩니다 (아마도 특정 문자가 이스케이프 된 경우).

짧은 버전은 입니다. 응용 프로그램에서 데이터가 CDATA로 인코딩되어 있는지 여부 ()가 신경 쓰이지 않아야합니다. 인코딩하려는 텍스트가 XML과 유사한 구문으로 너무 무겁지 않다면 &< 문자를 이스케이프 처리하는 것이 더 나을 것입니다. XML API가 아마도 당신을 위해 수행 할 것입니다. 예를 들어 XmlNode의 InnerText 속성은 필요에 따라 문자를 이스케이프합니다.

CDATA 태그를 사용하려는 경우 (큰 XML 조각을 이스케이프하면 결과 문서의 크기가 너무 커질 수 있음) 코드 CDATA 구문 조각 (]]>) 만 이스케이프 처리하면됩니다. 예를 들어 다음과 같이 수행 할 수 있습니다. 단순히 ]]>]]]]><![CDATA[>으로 바꾸십시오.

+0

XML 응용 프로그램을 다시 디자인 할 수있는 경우에만"XML "이 더 간단 할 때"XML에 포함 된 Base 64 인코딩 된 데이터 "그리고 훨씬 더 나아졌습니다. – Quentin

+0

@Quentin 저는 이것이 끔찍한 생각이고 내 대답을 고쳤다는 것을 깨달았습니다. – Justin

+0

백엔드 팀은''의 사용을 제안했습니다. 우리가 이름, 주소, 전화 번호를 말하고 있기 때문에 그렇게 좋은 생각입니다. "&'드물게 나타납니다. '> 전혀. 사용자가 악의적이지 않고 xml 삽입을 시도하지 않는 한. – Martin

0

해당 문자열을 포함해야하는 경우 CDATA 대신 문자 참조를 사용하십시오.

7

CDATA 섹션에는 기술적으로 다른 시작 태그 (<![CDATA[)가 포함될 수 있습니다. 단지 문자 데이터로 해석됩니다. 포함 할 수없는 내용은 ]]>입니다. 인코딩 할 때 사용자 제공 데이터에서 ]]>으로 CDATA를 분할하는 것이 일반적인 방법입니다. Wikipedia :

CDATA 섹션에는 "]]>"문자열을 사용할 수 없으므로 CDATA 섹션에 중첩 된 CDATA 섹션을 포함 할 수 없습니다. 트라이어드 "]]>"가 포함 된 텍스트를 인코딩하기 위해 CDATA 섹션을 사용하는 바람직한 방법은 ">"직전의 트라이어드를 각각 분리하여 여러 CDATA 섹션을 사용하는 것입니다.예를 들어, 인코딩하는 "]]>"하나 작성합니다

<![CDATA[]]]]><![CDATA[>]]> 

이 인코딩에 "]]>"CDATA 섹션의 중간에,] "의 모든 항목을 대체한다는 것을 의미] > "와 다음이 효과적으로 중지하고 CDATA 섹션을 다시 시작

]]]]><![CDATA[> 

합니다.

[종료 위키 백과 견적]

그 무엇을하고 있는지를 참조하십시오? (. 공백이 강조 추가) - 당신의 XML 프로세서에 의해 디코딩하는 동안 다시 함께 넣어 당신이 > 옆에 ]]로 인코딩 된 ]]>를 얻을

<![CDATA[ ]] ]]> 
<![CDATA[ > ]]> 

그래서 : 효과적으로, 당신이와 끝까지 것은 문자 데이터로 ]]>으로 끝나게되지만 ]]>은 CDATA 섹션에서 실제로 발생하지 않습니다.

그러나 이 날에 걱정할 필요가 없습니다.이에 대해 걱정할 필요가 없습니다. XML을 작성하기 위해 사용하는 도구/라이브러리가 무엇이든간에 간단히 관리해야하며, XML의 요소에 문자 데이터를 던지면 문자 데이터로의 변환은 XML 라이브러리가 적합한 방식으로 자동으로 수행되어야합니다. 당신이 그것에 대해 생각할 필요없이 모든 필요한 탈출.

악의적 인 사용자 데이터에 대해 염려하는 것이 좋지만,이 경우 가장 좋은 방법은 누군가가 이미 당신을 염려하고있는 성숙한 라이브러리를 적절하게 사용하는 것입니다. 당신이 당신의 자신의 XML 라이브러리를 작성하는 이유는

CDATA 섹션 내에서
+0

당신이 말하는 도구 about android 2.1에서만 사용할 수 있으며 Android 1.6 용으로 개발해야합니다. 기본적으로이 도구를 직접 작성해야한다는 의미입니다 .--(그래서 정말 대답 해 주셔서 감사합니다. – Martin