Согласно OWASP, для безопасного динамического обновления HTML в DOM мы рекомендуем
- Кодировка HTML, а затем
- 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);