Как я могу запретить ColdFusion конвертировать HTML-сущность?

Предположим, у меня есть хранилище данных, которое я не могу изменить.

В этом хранилище данных у меня есть таблица строковых значений:

  • BROWN
  • BLUE & RED
  • YELLOW & PURPLE
  • BLACK

Обратите внимание, что значения могут содержать как объекты HTML, так и их аналоги (например, & и &).

Теперь я хочу вывести эти значения в качестве входных значений (флажков).

Без каких-либо манипуляций ColdFusion преобразует & в &. Когда этот флажок установлен, и я проверяю его в хранилище данных, он терпит неудачу, поскольку YELLOW & PURPLE (значение хранилища данных) не равно YELLOW & PURPLE (значение формы).

Вот текущий [псевдо] код, который я использую для вывода флажков:

<cfquery name="LOCAL.qColors">
    SELECT
        COLOR
    FROM    COLORS
</cfquery>

<cfoutput query="LOCAL.qColors">
    <div>
    <input
        id="color-#CURRENTROW#"
        type="checkbox"
        class="checkbox"
        name="colors"
        value="#COLOR#"
        #IIF(ListFindNoCase(FORM.colors, COLOR), "'checked'", "")# />
    <label for="color-#CURRENTROW#">
        #COLOR#
    </label>
    </div>
</cfoutput>

Как я могу запретить ColdFusion декодировать объект HTML и использовать именно ту строку, которую я хочу?


person Eric Belair    schedule 08.09.2014    source источник
comment
Опубликуйте свой код, который отображает элементы <input>, а также ваш код, который обрабатывает отправленную форму.   -  person Dai    schedule 09.09.2014
comment
Без каких-либо манипуляций ColdFusion преобразует[...]. Не могли бы вы предоставить код, демонстрирующий это? Ваше здоровье.   -  person Adam Cameron    schedule 09.09.2014
comment
Какова природа этого хранилища данных? Это таблица базы данных? Если да, то есть ли другое поле, более подходящее для значения флажка?   -  person Dan Bracuk    schedule 09.09.2014
comment
Почему вы используете одну и ту же строку для value и label флажка? Кажется, у вас может быть какое-то значение ID, которое вы могли бы использовать, которое не будет испорчено кодировкой, и его будет легче сравнивать.   -  person Scott Stroz    schedule 09.09.2014
comment
@DanBracuk Это таблица базы данных. База данных не нормализована, и данные сами по себе не являются чистыми. Так что нет, другого подходящего поля нет. Если бы это было так, я бы не задавал этот вопрос.   -  person Eric Belair    schedule 09.09.2014
comment
@ScottStroz Извините, но, как я уже сказал в первой строке, данные такие, какие они есть - без идентификатора. На самом деле я ничего не могу сделать с фактическими данными, кроме как отображать их и использовать на внешнем интерфейсе. Опять же, мне не нужна помощь с базой данных, но я хочу найти способ сделать то, что я прошу.   -  person Eric Belair    schedule 09.09.2014


Ответы (1)


Скорее всего, это не имеет ничего общего с ColdFusion, и на самом деле ваш браузер (правильно) интерпретирует объекты HTML в исходном коде HTML вашей страницы. Если у вас есть какая-либо строка, которую вы НЕ хотите, чтобы ваш браузер анализировал как HTML, вы должны ее экранировать. Используйте функцию HTMLEditFormat() при выводе значения.

Это может быть особенно важно, если ваши значения когда-либо содержат двойные кавычки. И в качестве общей меры предосторожности НИКОГДА не выводите на веб-страницу голый (не экранированный) текст, если вы не ожидаете, что на нем будет безопасный разборчивый HTML, как для проблем с отображением, так и для проблем безопасности.

ColdFusion 9 и более ранние версии

#HTMLEditFormat( arbitraryValue )# 
<input name="myOptions" type="checkbox" value="#HTMLEditFormat( arbitraryValue )#">

ColdFusion 10+

#encodeForHTML( arbitraryValue )# 
<input name="myOptions" type="checkbox" value="#encodeForHTMLAttribute( arbitraryValue )#">

Затем вы увидите в исходном HTML-коде страницы, что «СИНИЙ И КРАСНЫЙ» становится «СИНИЙ КРАСНЫЙ», а «ЖЕЛТЫЙ ФИОЛЕТОВЫЙ» становится « ЖЕЛТЫЙ и ФИОЛЕТОВЫЙ". Когда этот HTML будет проанализирован, исходное значение будет использовано и отправлено формой.

person Brad Wood    schedule 09.09.2014
comment
Правильная идея, неправильная деталь. Вы не применяете формат htmledit к атрибуту значения, вы применяете его к тексту, который отображается пользователю, указывающему. - person Dan Bracuk; 09.09.2014
comment
На самом деле вы хотели бы применить его к атрибуту значения, а также к отображению, чтобы компенсировать любые конфликтующие символы. Другой способ взглянуть на это так: если в данных есть символ больше или меньше или даже кавычки, если это значение будет помещено в значение без форматирования, страница будет отображаться неправильно. Здесь также может быть решена основная проблема при сравнении на стороне обработки, хотя я хотел бы увидеть фактический код, заставляющий CF изменять значения БД при вводе в атрибут значения ввода. - person Snipe656; 09.09.2014
comment
Дэн, ты полностью избегаешь атрибута value. Особенно в этом случае, когда он содержит HTML, который не предназначен для анализа браузером. Я согласен с тем, что вы также избегаете текста в метке (или ВСЕГДА, где он отображается), но, поскольку я не включил метку в свой пример кода, это было спорным вопросом. Я обновил код, чтобы показать, что значение экранируется как в метке, так и во входном значении. - person Brad Wood; 09.09.2014
comment
И я обновился, чтобы использовать новые функции кодирования. :П - person Adrian J. Moreno; 09.09.2014
comment
Для меня это было редким событием. На самом деле я написал некоторый код и проверил свою теорию, прежде чем оставить свой комментарий. Поскольку Брэд и Снайп думают, что я ошибаюсь, я предлагаю им сделать то же самое. Суть моего теста заключалась в том, чтобы попробовать разные вещи в моем исходном коде ColdFusion и посмотреть, что получилось, когда я сделал View Source в браузере. - person Dan Bracuk; 09.09.2014
comment
Это отлично работает для того, что мне нужно. Не знал, что я могу использовать эту функцию для этого. Спасибо @БрэдВуд - person Eric Belair; 09.09.2014
comment
Спасибо за пример CF10 Адриан. Я почти упомянул об этом, но избегал этого, когда увидел, что вопрос был помечен как CF8, так как я не хотел путать OP с кодом, который не будет работать для него. - person Brad Wood; 09.09.2014