Каков предпочтительный способ обработки "<! [CDATA [" в блоке <! [CDATA [? - PullRequest
3 голосов
/ 02 августа 2011

<![CDATA[ и ]]> не допускаются внутри блока <![CDATA[ … ]]>.Это понятно.

Теперь я должен передать введенные пользователем данные внутри блока <![CDATA[ … ]]>.И злонамеренный пользователь может ввести либо <![CDATA[, либо ]]>, либо и то и другое.

Вопрос в том, какой предпочтительный способ справиться с этой ситуацией?и ]]>?

Заменить его пробелами? Пошвырнуть пользователя сообщением об ошибке? Или существует официальный способ их фактической передачи?

Ответы [ 4 ]

7 голосов
/ 02 августа 2011

Раздел CDATA технически может содержать другой начальный тег - <![CDATA[ - он просто интерпретируется как символьные данные. Чего он не может содержать, так это ]]>. Обычный подход заключается в разделении CDATA на ]]> в предоставленных пользователем данных при кодировании. От Википедия :

Раздел CDATA не может содержать строку "]]>", и поэтому раздел CDATA не может содержать вложенные разделы CDATA. Предпочтительный подход к использованию разделов CDATA для кодирования текста, содержащего триаду «]]>», заключается в использовании нескольких разделов CDATA путем разделения каждого вхождения триады непосредственно перед «>». Например, для кодирования "]]>" можно написать:

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

Это означает, что для кодирования "]]>" в середине раздела CDATA замените все вхождения "]]>" следующим:

]]]]><![CDATA[>

Это эффективно останавливает и перезапускает раздел CDATA.

[конец цитаты из Википедии]

Видишь, что это делает? Фактически, в итоге вы получите:

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

(Пробелы добавлены для акцентирования.) Таким образом, вы получите ]]>, закодированный как ]] рядом с > - при объединении во время декодирования вашим XML-процессором вы получите ]]> в качестве символьных данных, но ]]> фактически никогда не встречается в вашем разделе CDATA.

Однако, не должно быть никакой необходимости, в наше время, чтобы вы беспокоились об этом . Какой бы инструмент / библиотека вы не использовали для создания XML, он должен просто управлять вами, и если вы добавляете символьные данные в элемент вашего XML, преобразование в символьные данные должно выполняться автоматически так, как библиотека XML сочтет нужным, с все необходимые побеги, не думая об этом.

Хорошо беспокоиться о злонамеренных пользовательских данных, но лучший способ справиться с ними в этом случае - правильно использовать зрелую библиотеку, где кто-то уже беспокоился об этом за вас.

2 голосов
/ 02 августа 2011

Я думаю, что вы думаете о разделах CDATA неправильно - CDATA означает «символьные данные», а синтаксис CDATA - это просто синтаксис для блока данных, который не следует интерпретировать как разметку. Разделы CDATA полезны для встраивания документов xml в другой документ xml, однако при включении символьных данных (т. Е. Текста) в документ не следует изменять значение данных, если они заключены в раздел CDATA, а не просто кодироваться как текстовые данные. (возможно, с некоторыми экранированными символами).

Краткая версия этого: ваше приложение не должно заботиться о том, закодированы ли данные как CDATA или нет . Если кодируемый вами текст не слишком насыщен с помощью XML-подобного синтаксиса, то вам, возможно, лучше просто экранировать символы & и < - то, что ваш XML API, вероятно, сделает для вас в любом случае. Например, свойство InnerText XmlNode будет экранировать символы по мере необходимости.

Если вы все еще хотите использовать теги CDATA (выход из большого фрагмента xml может чрезмерно увеличить размер результирующего документа), вам нужно только избежать кодового синтаксиса CDATA (]]>), например, это можно сделать просто заменив ]]> на ]]]]><![CDATA[>.

1 голос
/ 02 августа 2011

В разделе CDATA замените все ]]> на ]]]]><![CDATA[>

0 голосов
/ 02 августа 2011

Используйте символьные ссылки вместо CDATA, когда вам нужно включить эту строку.

...