DOM XSS и Javascript Escape - PullRequest
       58

DOM XSS и Javascript Escape

0 голосов
/ 11 мая 2018

Я прохожу все правила OWASP для предотвращения XSS на основе DOM и пытаюсь получить полное понимание каждого правила.Я немного застрял в этом правиле:

"ПРАВИЛО № 2 - JavaScript Escape перед вставкой ненадежных данных в подконтекст атрибута HTML в контексте выполнения"

См. Здесь:

https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet#RULE_.232_-_JavaScript_Escape_Before_Inserting_Untrusted_Data_into_HTML_Attribute_Subcontext_within_the_Execution_Context

Проблема в том, что я не уверен, какой метод использовать, когда "javascript escaping" на внешнем интерфейсе?Я знаю, что это не очень вероятный вариант использования, потому что большинство разработчиков переднего плана обычно избегают вставки ненадежных данных в атрибут html, но, тем не менее, я хотел бы полностью понять, что подразумевается под этим правилом, понимая, что именнометод побега должен быть.Есть ли простой метод побега javascript, который люди обычно используют во фронтэнде?Спасибо!


РЕДАКТИРОВАТЬ: Другие ответы, которые я нахожу на stackoverflow все упоминания HTML Escapers.Я специально ищу javascript escaper и хочу знать, почему owasp специально использует термин «javascript escaper», если, как полагают некоторые, html escaper достаточно.

Возможно, вопрос также может бытьформулируется как "В контексте шпаргалки OWASP для XSS на основе DOM, в чем разница между экранированием html и экранированием javascript? Пожалуйста, приведите пример экранирования javascript.

1 Ответ

0 голосов
/ 11 мая 2018

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

Экранирование JavaScript предназначено для значений, которые вставляются непосредственно в строковый литерал JavaScript через серверный язык шаблонов.

Итак, у них есть пример:

x.setAttribute("value", '<%=Encoder.encodeForJS(companyName)%>');

Здесь значение companyName вставляется в скрипт, заключенный в одинарные кавычки, что делает его строковым литералом JavaScript. Специальные символы здесь - это кавычки, новые строки и некоторые символы пробела в Юникоде. Они должны быть преобразованы в escape-последовательности JavaScript. Таким образом, цитата станет \x27, а не сущностью HTML &#x27;. Если бы вы использовали кодировку HTML, то символ кавычки отображался бы как &#x27;, а символ новой строки вызывал бы синтаксическую ошибку. Кодирование JavaScript может быть сделано в Java с помощью encodeForJavaScript или PHP с помощью json_encode .

Он вставляется в значение JavaScript, поэтому должно быть закодировано в JavaScript. Люди привыкли к атрибутам кодирования HTML, но это имеет смысл только при прямой вставке в HTML, а не при использовании метода setAttribute DOM. Необходимая кодировка такая же, как если бы она была похожа на:

var x = '<%=Encoder.encodeForJS(companyName)%>';

Атрибут не обязательно должен быть закодирован в HTML, потому что он не находится в контексте HTML. Кодировка HTML необходима, когда значение вставляется непосредственно в атрибут, такой как:

<input value='<%=Encoder.encodeForHTML(companyName)%>'>
...