根据 OWASP,要在 DOM 中安全地动态更新 HTML,我们建议
- HTML 编码,然后
- JavaScript 编码所有不受信任的输入,如以下示例所示:
element.innerHTML = “<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>”;
有一个 Web 应用程序,其中 servlet 接收用户输入(作为 AJAX 请求接收),处理数据并发送文本响应,该响应用于通过设置元素的值(使用document.getElementById("elementID").innerHTML = data;)动态更改 DOM。
为了防止基于 DOM 的 XSS,需要使用 ESAPI 编码器来转义 HTML 和 JavaScript
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);