0

根据 OWASP,要在 DOM 中安全地动态更新 HTML,我们建议

  1. HTML 编码,然后
  2. 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);
4

1 回答 1

0

我假设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

于 2014-12-16T10:07:05.130 回答