Такое jQuery.text () метод XSS безопасный?


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

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

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

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

6 58

6 ответов:

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

С jQuery docs:

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

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

потому что атаки 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;');​

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

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

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

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

для этого лучше использовать замена струн (на по крайней мере <).

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

The # 1 OWASP suggestion - это:

Правило #1-HTML Escape перед вставкой ненадежных данных в HTML элемент Содержание

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

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

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