使用ESAPI防止基于DOM的XSS

时间:2014-12-15 10:37:21

标签: java security xss esapi

根据OWASP,为了在DOM安全中对HTML进行动态更新,我们建议

  1. HTML编码,然后
  2. JavaScript编码所有不受信任的输入,如图所示 这些例子: element.innerHTML = “<%=Encoder.encodeForJS(Encoder.encodeForHTML(untrustedData))%>”;
  3. 有一个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);
    

1 个答案:

答案 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