根据OWASP,为了在DOM安全中对HTML进行动态更新,我们建议
element.innerHTML = “<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>”;
有一个Web应用程序,servlet接收用户输入(作为AJAX请求接收),处理数据并发送文本响应,用于通过设置元素的值动态更改DOM(使用{{ 1}})。
要防止基于DOM的XSS,需要使用ESAPI编码器转义HTML和JavaScript
document.getElementById("elementID").innerHTML = data;
或将未编码的String写入流
是否安全String htmlEscapedStr=ESAPI.encoder().encodeForHTML(content);
String JSEscapedStr=ESAPI.encoder().encodeForJavaScript(htmlEscapedStr);
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(JSEscapedStr);
答案 0 :(得分:0)
我假设content
是纯文本,并且您不希望在content
本身中包含HTML。您不需要对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
设置为返回值。
或将未编码的String写入流
是否安全
如果content
包含任何&#34;不受信任的&#34;数据(&#34;不信任&#34;读&#34;来自用户输入&#34;或&#34;来自外部来源&#34;)然后可能包含脚本代码作为XSS攻击的一部分。如果它来自受信任的来源,但它被格式化为纯文本,则<
等字符可能会破坏输出的格式,但不会导致安全问题。例如,1 < 2 > 1.5
等数学表达式将在浏览器中输出为1 1.5
。