Подтвердить что ты не робот

Безопасен ли метод jQuery.text() XSS?

У меня нет данных от пользователей.

Так безопасно использовать вот так:

var data = '<test>a&f"#</test>'; // example data from ajax response
if (typeof(data) === 'string')
    $('body').text(data);

Могу ли я использовать подобное, или есть некоторые проблемы, такие как кодирование или некоторые конкретные символы, которые я должен соблюдать осторожно и добавить более строгую проверку?

4b9b3361

Ответ 1

Когда вы устанавливаете текст элемента с помощью метода text, jQuery использует createTextNode внутренне, что ускользает от всех специальных символов.

Из jQuery docs:

Нам нужно знать, что этот метод избегает строки, предоставленной как необходимо, чтобы он корректно отображался в HTML. Для этого он вызывает метод DOM .createTextNode(), который заменяет специальные символы с их эквивалентами сущности HTML (например, &lt; для <)

Итак, это должно быть безопасно. Здесь ваш пример в jsfiddle. Обратите внимание, как теги отображаются как литеральный текст.

Ответ 2

Поскольку атаки XSS полагаются на возможность вставлять узлы DOM (<img />, <script />) и т.д., а jQuery.fn.text() не поддерживает это, он полностью безопасен XSS.

Как вы можете видеть в этом базовом примере, все теги be-have-HTML кодируются в результате jQuery, используя createTextNode внутренне

jQuery('div').text('<test>a&f"#</test>');​

Итак, то, что фактически вставлено, более равнозначно;

jQuery('div').html('&lt;test&gt;a&f"#&lt;/test&gt;');​

Ответ 4

Автор http://benv.ca/2012/10/02/you-are-probably-misusing-DOM-text-methods/ не рекомендует использовать createTextNode или jQuery .text().

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

Лучше использовать замену строки (не менее <).

Некоторые примеры из хорошо защищенных библиотек:

# 1 предложение OWASP:

ПРАВИЛО №1 - Сбой HTML перед установкой ненадежных данных в содержимое HTML-элементов

Ответ 5

В отличие от метода .html(),.text() может использоваться как в XML, так и в HTML документы. Результатом метода .text() является строка, содержащая комбинированный текст всех согласованных элементов. (Из-за вариаций в HTML синтаксические анализаторы в разных браузерах, возвращаемый текст может изменяться в новых символах и другое пустое пространство.)

.text(data) удалит <test></test> и оставит вас с a&f#

Ответ 6

Да. Он имеет дело с текстом, а не с кодом.