Такое jQuery.text () метод XSS безопасный?
У меня есть неоткрытые данные от пользователей.
Так это безопасно использовать так:
var data = '<test>a&f"#</test>'; // example data from ajax response
if (typeof(data) === 'string')
$('body').text(data);
могу ли я использовать это или есть некоторые проблемы, такие как кодирование или некоторые конкретные символы, которые я должен быть осторожным и добавить более строгую проверку?
6 ответов:
при установке текста элемента с помощью
text
метод, jQuery используетcreateTextNode
внутри, который экранирует все специальные символы.С jQuery docs:
мы должны знать, что этот метод экранирует строку, предоставленную как необходимо, чтобы он правильно отображался в HTML. Для этого он вызывает метод DOM
.createTextNode()
, который заменяет специальные символы с их эквивалентами сущности HTML (например,<
для<
)так что да, это должно быть безопасно. Вот это ваш пример в jsfiddle. Обратите внимание, как теги отображаются как обычный текст.
потому что атаки XSS полагаются на возможность вставки узлов DOM (
<img />
,<script />
) и т. д., иjQuery.fn.text()
не поддерживает это, это полностью XSS безопасно.как вы можете видеть в этой простой пример, все потенциальные HTML-теги кодируются в результате jQuery с помощью
createTextNode
внутри:jQuery('div').text('<test>a&f"#</test>');
так что на самом деле вставлено более равнозначно;
jQuery('div').html('<test>a&f"#</test>');
вы все равно должны быть осторожны при вставке результата в DOM-см.:уязвимость межсайтового скриптинга с JavaScript и JQuery.
для установки текста элементов, однако, текст должен быть XSS безопасным.
автор из http://benv.ca/2012/10/02/you-are-probably-misusing-DOM-text-methods/ возражает против использования
createTextNode
или jQuery.text()
....если вы знаете контекст, в котором вы вводите значение (т. е. не атрибуты), то этот метод безопасен. Мой аргумент заключается в том, что разработчики недостаточно хорошо понимают эти контексты, и рано или поздно они ошибутся.
для этого лучше использовать замена струн (на по крайней мере
<
).некоторые примеры из хорошо защищенных библиотек:
- усы https://github.com/janl/mustache.js/blob/master/mustache.js#L55
- угловой https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L438
The # 1 OWASP suggestion - это:
Правило #1-HTML Escape перед вставкой ненадежных данных в HTML элемент Содержание
в отличие от .метод html (),.text() может использоваться как в XML, так и в HTML документы. Результат .метод text () представляет собой строку, содержащую комбинированный текст всех сопоставленных элементов. (Из-за вариаций в HTML Парсеры в разных браузерах, возвращаемый текст может отличаться в новых строках и другое белое пространство.)
.text(data)
будет убрать<test></test>
прочь и оставьте вас сa&f#