Безопасен ли метод jQuery.text() XSS?
У меня нет данных от пользователей.
Так безопасно использовать вот так:
var data = '<test>a&f"#</test>'; // example data from ajax response
if (typeof(data) === 'string')
$('body').text(data);
Могу ли я использовать подобное, или есть некоторые проблемы, такие как кодирование или некоторые конкретные символы, которые я должен соблюдать осторожно и добавить более строгую проверку?
Ответы
Ответ 1
Когда вы устанавливаете текст элемента с помощью метода text
, jQuery использует createTextNode
внутренне, что ускользает от всех специальных символов.
Из jQuery docs:
Нам нужно знать, что этот метод избегает строки, предоставленной как необходимо, чтобы он корректно отображался в HTML. Для этого он вызывает метод DOM .createTextNode()
, который заменяет специальные символы с их эквивалентами сущности HTML (например, <
для <
)
Итак, это должно быть безопасно. Здесь ваш пример в 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('<test>a&f"#</test>');
Ответ 3
Вы должны быть осторожны при вставке результата в DOM - см. Уязвимость Cross-Site Scripting с JavaScript и JQuery.
Однако для установки текста элементов текст должен быть безопасным для XSS.
Ответ 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
Да. Он имеет дело с текстом, а не с кодом.