Является ли метод JQuery .text () XSS безопасным? - PullRequest
60 голосов
/ 16 марта 2012

У меня есть неэкранированные данные от пользователей.

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

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

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

Ответы [ 6 ]

55 голосов
/ 16 марта 2012

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

Из документов jQuery :

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

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

14 голосов
/ 16 марта 2012

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

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

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

Так что то, что вставлено на самом деле , более эквивалентно;

jQuery('div').html('&lt;test&gt;a&f"#&lt;/test&gt;');​
8 голосов
/ 16 марта 2012

Вы все равно должны быть осторожны при вставке результата в DOM - см .: Уязвимость межсайтового скриптинга в JavaScript и JQuery .

Однако для настройки текста элементов,текст должен быть безопасным для XSS.

1 голос
/ 14 декабря 2016

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

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

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

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

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

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

0 голосов
/ 16 марта 2012

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

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

0 голосов
/ 16 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...