Предотвращение XSS на основе DOM с помощью ESAPI

Согласно OWASP, для безопасного динамического обновления HTML в DOM мы рекомендуем

  1. Кодировка HTML, а затем
  2. JavaScript кодирует весь ненадежный ввод, как показано в следующих примерах: element.innerHTML = “<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>”;

Существует веб-приложение, в котором сервлет получает пользовательский ввод (полученный как запрос AJAX), обрабатывает данные и отправляет текстовый ответ, который используется для динамического изменения DOM путем установки значения элемента (используя document.getElementById("elementID").innerHTML = data;).

Чтобы предотвратить XSS на основе DOM, необходимо экранировать HTML и JavaScript с помощью кодировщика ESAPI, как

String htmlEscapedStr=ESAPI.encoder().encodeForHTML(content);
String JSEscapedStr=ESAPI.encoder().encodeForJavaScript(htmlEscapedStr);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(JSEscapedStr);

;

или безопасно записывать незакодированную строку в поток

response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(content);

person Sameer Sarmah    schedule 15.12.2014    source источник


Ответы (1)


Я предполагаю, что content — это обычный текст, и вы никогда не захотите содержать HTML в самом content. Вам не нужно кодировать для JavaScript, так как значение не внедряется в JavaScript, оно просто используется JavaScript в контексте JavaScript для установки innerHTML. Итак, правильный способ:

String htmlEscapedStr=ESAPI.encoder().encodeForHTML(content);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(htmlEscapedStr);

Тип контента, оставленный как text/plain, подходит в этом контексте, поскольку приложение, получающее данные (ваша веб-страница), не должно интерпретировать сам тип контента, поскольку оно просто устанавливает innerHTML в возвращаемое значение.

или безопасно записывать незакодированную строку в поток

Если content содержит какие-либо «ненадежные» данные (для «ненадежных» читайте «из пользовательского ввода» или «из внешнего источника»), то потенциально он может содержать код скрипта как часть атаки XSS. Если он из надежного источника, но отформатирован как обычный текст, то такие символы, как <, могут нарушить форматирование вашего вывода, но не вызовут проблемы с безопасностью. Например, такое математическое выражение, как 1 < 2 > 1.5, будет отображаться в браузере как 1 1.5.

person SilverlightFox    schedule 16.12.2014
comment
content — это строка, содержащая HTML-содержимое, например String content= ‹option value=A›A‹/option› ‹option value=B›B‹/option›; - person Sameer Sarmah; 16.12.2014
comment
В этом случае вы захотите запустить ESAPI.encoder().encodeForHTML(x) только на ненадежных частях content. например content = "<option value=\"A\">" + ESAPI.encoder().encodeForHTML(userInput) + "</option>". - person SilverlightFox; 16.12.2014