Struts 2编码输入参数以避免XSS

时间:2011-02-09 09:42:05

标签: java security struts2 xss

我有一个使用Struts 2构建的应用程序。它存在跨站点脚本(XSS)攻击的一些问题。我想以与JSP <c:out value="${somevalue}"/>类似的方式对一些操作输入参数进行编码。在Struts 2中有没有简单的方法来执行此操作? Java API方法可以。

编辑我找到了这个 - http://www.owasp.org/index.php/Talk:How_to_perform_HTML_entity_encoding_in_Java

有任何经验吗?

3 个答案:

答案 0 :(得分:10)

您可以使用

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

${fn:escapeXml(someValue)}

还有一个好的API JSoup

  

Sanitize untrusted HTML

     

问题

     

您希望允许不受信任的用户为您网站上的输出提供HTML(例如,作为评论提交)。您需要清除此HTML以避免cross-site scripting(XSS)攻击。

     

解决方案

     

将jsoup HTML CleanerWhitelist指定的配置一起使用。

String unsafe = 
      "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
      // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

因此,在处理提交的文本时,您基本上需要做的就是以下内容:

String text = request.getParameter("text");
String safe = Jsoup.clean(text, Whitelist.basic());
// Persist 'safe' in DB instead.

struts2securityaddons

  

此项目包含其他配置,拦截器和其他用于提高struts 2应用程序安全性的代码。

另见

答案 1 :(得分:6)

作为XSS预防手段转义输入参数有几个不利因素,尤其是:

  • 您无法确定特定输入数据的目的地,因此您无法选择正确的转义方案。
  • 转义输入数据掩码缺少输出转义。如果没有一致的输出转义,您仍然可以意外地将未转义的数据传递给未转义的输出。
  • 转义的存在使数据处理变得复杂。

因此,最好应用一致的输出转义。

另见:

答案 2 :(得分:1)

对于带有struts 2标签的XSS,没有简单易用的解决方案。 OWASP ESAPI API对转义非常有用,并且它们有标记库。

我的方法是基本上以下列方式扩展stuts 2标签。

  1. 修改s:属性标记,以便它可以采用额外的属性来说明需要什么类型的转义(escapeHtmlAttribute =“true”等)。这涉及创建一个新的Property和PropertyTag类。 Property类使用OWASP ESAPI api进行转义。
  2. 更改freemarker模板以使用新版本的s:property并设置转义。
  3. 如果您不想在步骤1中修改类,则另一种方法是将ESAPI标记导入到freemarker模板中并根据需要进行转义。然后,如果您需要在JSP中使用s:property标记,请使用ESAPI标记将其包装。

    我在这里写了更详细的解释。

    http://www.nutshellsoftware.org/software/securing-struts-2-using-esapi-part-1-securing-outputs/

    我同意逃避投入并不理想。