【问题标题】:Struts 2 encode input parameters to avoid XSSStruts 2 对输入参数进行编码以避免 XSS
【发布时间】:2011-06-24 00:12:36
【问题描述】:

我有一个使用 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

有经验吗?

【问题讨论】:

  • 您必须指定 XSS 的可能方式,如果您使用 s:property 则 "

    hello!

    " 将呈现为...您需要设置转义property 为 false 以便您至少在 property 标记中输出 html。 s:property 在输出中很受欢迎,所以你必须做一些不同的事情?
  • 我不想更改输出,应用程序太复杂了。

标签: java security struts2 xss


【解决方案1】:

你可以使用

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

${fn:escapeXml(someValue)}

还有一个很好的APIJSoup

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 应用程序安全性的额外配置、拦截器和其他代码。

另请参阅

【讨论】:

    【解决方案2】:

    将输入参数转义作为 XSS 预防手段有几个缺点,尤其是:

    • 您无法确定特定输入数据的目的地,因此您无法选择合适的转义方案。
    • 转义输入数据掩盖了缺少输出转义。如果没有一致的输出转义,您仍然可以不小心将未转义的数据传递给未转义的输出。
    • 存在转义会使数据处理复杂化。

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

    另请参阅:

    【讨论】:

    • 是的,转义输出会更好,但是很容易错过输出转义,因为它适用于多个地方,而输入摄入更加集中,很少修改。我确定我的输入中不需要 HTML 标记。
    • 不过,在入站时逃脱是粗略的。如果发现了新的攻击方法怎么办?您是否要重新编码所有迄今为止积累的数据?此外,您假设您总是想要输出 html。如果将来你想发出 text/plain 怎么办?您将在输出中包含所有这些时髦的 html 转义码。
    【解决方案3】:

    对于带有 struts 2 标签的 XSS,没有简单的、开箱即用的解决方案。 OWASP ESAPI API 有一些非常有用的转义支持,并且它们有标签库。

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

    1. 修改 s:property 标记,使其可以采用额外的属性来说明需要哪种类型的转义(escapeHtmlAttribute="true" 等)。这涉及创建一个新的 Property 和 PropertyTag 类。 Property 类使用 OWASP ESAPI api 进行转义。
    2. 更改 freemarker 模板以使用新版本的 s:property 并设置转义。

    如果您不想在步骤 1 中修改类,另一种方法是将 ESAPI 标记导入 freemarker 模板并根据需要进行转义。然后,如果您需要在 JSP 中使用 s:property 标记,请使用 ESAPI 标记将其包装起来。

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

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

    我同意转义输入并不理想。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 2020-05-28
      相关资源
      最近更新 更多