Экранирование контента для размещения с помощью функции jQuery .html () - PullRequest
2 голосов
/ 04 октября 2011

Мне нужно принять произвольный пользовательский ввод.Позже я хочу скопировать этот ввод, уже экранированный в объекты HTML, в текстовое поле, чтобы его можно было редактировать.Однако функция jQuery jQuery.html() считывает сущности HTML, как если бы они были настоящим HTML, и внедряет пользовательский сценарий непосредственно в страницу.Мне нужно захватить содержимое пользовательского ввода, даже если оно содержит <script> теги, и вывести его в текстовую область, где его можно редактировать.

Итак, мне нужно это:

<textarea name="empty"></textarea>
<div name="user-input"> &lt;script&gt; window.alert('hi'); &lt;/script&gt; </div>

, чтобы стать этим:

<textarea name="empty"> &lt;script&gt; window.alert('hi'); &lt;/script&gt; </textarea>
<div name="user-input"> &lt;script&gt; window.alert('hi'); &lt;/script&gt; </div>

на триггере JavaScript.Вместо этого текстовое поле становится:

<textarea name="empty"> <script> window.alert('hi'); </script> </textarea>

с отображением пустого текстового поля и введением JavaScript-кода пользователя на страницу.

Прямо сейчас я получаю содержимое пользовательского ввода и помещаю его втекстовое поле выглядит так:

 $('#edit-textarea').html(($('#user-input').text()));

Я пробовал несколько вариантов этого, но безрезультатно.

Пожалуйста, см. http://jsfiddle.net/vkRkt/8 для теста.

РЕДАКТИРОВАТЬ:

См. Обсуждение ниже.Решением в моем случае было использование jquery.val() вместо jquery.html().Я пропустил val, потому что у меня сложилось впечатление, что это псевдоним для jquery.attr('value', new_value), который имеет свои проблемы с инъекцией (может быть остановлен с помощью "). val() не совпадает с attr('value', val) и в моих кратких испытаниях кажется безопасным от попыток инъекции.

Если кто-то столкнется с этим позже и узнает, что val на самом деле не безопасный способ сделать это, пожалуйста, ответьте и обновите нас немедленно.

Спасибо.

1 Ответ

1 голос
/ 04 октября 2011
$('#edit-textarea').val(($('#user-input').text()));

отлично работает для меня. Я также попытался использовать .text() вместо .val(), и это, конечно же, сохранило побег. Не используйте .html(), если вы не хотите, чтобы данные были HTML.

jsFiddle Demo

...