Кодировать HTML перед POST

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

Как правильно закодировать полное значение перед публикацией?

function htmlEncode(value){ 
    return $('<div/>').text(value).html(); 
} 

Приведенный выше скрипт дает мне следующее:

&lt;p&gt;Test&amp;nbsp; &lt;span style="color: #ffffff"&gt;&lt;strong&gt;&lt;span style="background-color: #ff0000"&gt;1+1+1=3&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

Мне нужно, чтобы это дало мне это:

&lt;p&gt;Test&amp;nbsp; &lt;span style=&quot;color: #ffffff&quot;&gt;&lt;strong&gt;&lt;span style=&quot;background-color: #ff0000&quot;&gt;1+1+1=3&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

РЕДАКТИРОВАТЬ: дополнительный вопрос: Закодированный HTML в базе данных обратно на страницу


person oshirowanen    schedule 04.02.2011    source источник
comment
Похоже, вы пытаетесь заставить клиента сделать некоторый текст HTML безопасным перед отправкой на сервер. Не делай этого. Сделайте содержимое HTML безопасным при выходе из системы, а не при входе (и особенно не на клиенте, где его можно подделать)   -  person Quentin    schedule 04.02.2011
comment
Зачем вам это нужно делать JS на клиенте?   -  person troutinator    schedule 04.02.2011
comment
Почему вы все равно хотите, чтобы он дал вам &quot;? Если вы не планируете вставлять данные в значение атрибута (которое вы смешиваете вместе, используя строки вместо использования DOM или другого разумного API), тогда вы просто используете 6 байтов, когда достаточно 1, и это затрудняет чтение.   -  person Quentin    schedule 04.02.2011
comment
Я попытался отправить серверу html, но мне это не понравилось: stackoverflow.com/questions/4897441/   -  person oshirowanen    schedule 04.02.2011
comment
см. эту ссылку tumuski.com/code/htmlencode   -  person andres descalzo    schedule 04.02.2011
comment
Вам дали плохой совет. Вы должны отключить сверхчувствительный фильтр, чтобы вы могли получить данные, которые хотите получить (а затем осторожно обращаться с ними, чтобы защитить себя от XSS).   -  person Quentin    schedule 04.02.2011
comment
Последующий вопрос здесь: stackoverflow. com/questions/4899365/   -  person oshirowanen    schedule 04.02.2011


Ответы (6)


Вы не должны пытаться кодировать вещи с помощью JavaScript.

Вы должны кодировать его на стороне сервера.

Все, что можно сделать с помощью JavaScript, можно отменить.

Можно закодировать его в JavaScript, если вы также проверите, что он был закодирован на сервере, но имейте в виду: JavaScript можно отключить.

person George Stocker    schedule 04.02.2011
comment
Я попытался опубликовать стандартный HTML-код на сервере, но получаю сообщение об ошибке, говорящее о том, что я пытаюсь выполнить межсайтовый скриптинг или что-то в этом роде. Вот ссылка, когда я пытался отправить html на сервер без его кодирования. stackoverflow.com/questions/4897441/ - person oshirowanen; 04.02.2011
comment
@oshirowanen Я предполагаю, что вы используете vb.net, вам нужно отключить проверку страницы, чтобы получить контент как есть. - person BrunoLM; 04.02.2011
comment
Что вы используете в качестве языка на стороне сервера? - person George Stocker; 04.02.2011
comment
Последующий вопрос здесь: stackoverflow. com/questions/4899365/ - person oshirowanen; 04.02.2011
comment
есть совершенно допустимые моменты для кодирования с помощью javascript, например, когда вы хотите НЕ запускать обнаружение XSS asp.net, когда вы публикуете ‹x более новых «приличных» редакторов wysiwyg, которые сделают это (и это правильно), поэтому запрашивать проверку не нужно быть инвалидом - person Adam Tuliper - MSFT; 12.12.2011
comment
@AdamTuliper Вы совершенно правы, но JavaScript можно отключить. Независимо от того, кодируете вы его в JavaScript или нет, вы также должны запускать его через кодирование на стороне сервера. - person George Stocker; 10.02.2012
comment
@GeorgeStocker согласился, но ваш комментарий заключался в том, чтобы не кодировать вещи с помощью javascript, и есть 100% допустимое время для этого перед публикацией. В этом случае я упомянул, что вы не хотели бы кодировать на стороне сервера, цель состоит в том, чтобы кодировать, чтобы обойти ограничения публикации html без отключения проверки запроса. Данные, как правило, не должны храниться в закодированном виде, а должны быть очищены, в противном случае вы можете столкнуться с проблемами двойного кодирования. - person Adam Tuliper - MSFT; 10.02.2012

То, что Джордж говорит, верно. Но если вам нужно кодировать строки на стороне клиента, я бы посоветовал вам использовать encodeURIComponent().

person Labu    schedule 04.02.2011
comment
The escape and unescape functions are deprecated. Use encodeURI, encodeURIComponent, decodeURI or decodeURIComponent to encode and decode escape sequences for special characters. developer.mozilla.org/en/JavaScript/Reference/ - person BrunoLM; 04.02.2011


Вы можете использовать этот модуль в js, не требуя jQuery:

htmlencode

person andres descalzo    schedule 04.02.2011

Вы можете повторно использовать функции из проекта php.js — htmlentities и get_html_translation_table

person Distdev    schedule 04.02.2011
comment
Это действительно должно быть сделано на стороне сервера. В любом случае, вы должны использовать htmlspecialchars() вместо htmlentities(). - person nyuszika7h; 04.02.2011

Используйте escape(str) на стороне клиента

и

HttpUtility.UrlDecode(str, System.Text.Encoding.Default); на стороне сервера

это сработало для меня.

person Sohel Pathan    schedule 02.04.2014
comment
Я не уверен, что вы поняли вопрос, и это конкретно запрос на отправку клиентского кода на сервер. Он также вообще не упоминает сервер, поэтому код сервера, который вы включили, скорее всего, не имеет отношения к делу. - person Andrew Barber; 02.04.2014
comment
Да, Андрей, ты прав. Я дал ему трюк для кодирования на стороне клиента. и дополнительно я подсказал ему, как обращаться с этим на стороне сервера, если это необходимо, - person Sohel Pathan; 03.04.2014