【问题标题】:ESAPI implementation for spring form tagsspring 表单标签的 ESAPI 实现
【发布时间】:2014-01-16 14:44:08
【问题描述】:

我们如何在使用 java 和 spring-mvc 的应用程序中实现 ESAPI 输出编码。

阅读了很多帖子并看到了这个:

<%@ page import="org.owasp.esapi.*" %>
<input type="hidden" name="hidden" value="<%out.print(ESAPI.encoder().encodeForHTML(content));%>"/>

但是,在我的应用程序中,所有的 jsps 都使用 spring 表单标签,如下所示,

<td>Number: 
        <form:input path="someNo" size="20" maxlength="18" id="firstfield" onkeypress="return PressAButton('submithidden');"/></td>

我怎样才能为上述代码实现 ESAPI?有没有其他实现输出编码的方法,比如创建一个过滤器之类的?任何建议都非常感谢!

【问题讨论】:

  • 我没有看到 spring 在哪里编码你的值。您是否尝试将 htmlEscape="true" 设置为 form:input 标签的属性?

标签: java jsp spring-mvc esapi


【解决方案1】:

在研究了一下spring标签之后,似乎数据绑定发生在框架代码中,从而阻止您在jsp中应用任何转义。

一个,半快速获胜可能会默认所有输出以转义 HTML。在 web.xml 中添加这个条目:

<context-param>
  <param-name>defaultHtmlEscape</param-name>
  <param-value>true</param-value>
</context-param>

这里唯一的问题是输出转义是一个很大的痛苦......当您的值将作为数据传递给 HTML 属性或 Javascript 函数时,html 转义的规则是不同的。并且您的应用程序的某些部分可能不希望 html 转义,但您应该能够在需要时使用表单标签属性 htmlEscape="false" 覆盖那些部分。

您需要能够挂钩 Spring 标记中将 HTML 绑定到表单的部分,但您需要能够做到这一点,以便您可以根据放置的位置进行转义。 HTMLAttribute 的转义规则与纯 HTML 不同,如果值将作为数据传递给 javascript 函数。所以 Spring 的解决方案只防御一类攻击。

这些是我看到的唯一出路,所有这些都需要工作:

  1. 使用 JSTL 标签而不是 Spring 标签,这样您就可以使用 ${thisSyntax} 编写变量并将它们包装在 esapi 标签中,如下所示:

    &lt;c:out value="&lt;esapi:encodeForHTML&gt;${variable}&lt;/esapi:encodeForHTML&gt;"/&gt;

  2. 遵循@A 之类的解决方案。 Paul 提出,您可以在控制器端进行上下文转义。我知道你觉得这不是一个选择,但我提出的下一个解决方案是未经测试的。

  3. 实现您自己的标记库,它是[org.springframework.web.servlet.tags.form.InputTag][1] 的子类,特别是方法writeValue。虽然 esapi 可以防止很多问题,但我建议您查看 owasp 的 new Encoder project 以准确地向您展示输出编码是多么棘手。理想情况下,您的标签库将允许您使用 esapi 的编码器或这个新的 API。

【讨论】:

    【解决方案2】:

    只是一个想法,不确定这是否是您要找的。​​p>

    你能不能在Java中使用下面的代码,改变bean本身的数据,然后在用户界面中发送。

    if ( ESAPI.securityConfiguration().getLogEncodingRequired() ) {
        data = ESAPI.encoder().encodeForHTML(message);
    }
    

    您可以查看以下网址。 http://www.jtmelton.com/tag/esapi/

    【讨论】:

    • 这有利于验证目的,但对于输出编码则不好。我试过了,但我们的伤害评分报告仍然显示这是一个问题
    • 好的。那么“ESAPI.encoder().encodeForHTML(message)”就不能用了吗?
    • 您可能已经检查过此内容,但仅供参考。 stackoverflow.com/questions/11659287/…
    • 也不是很确定,但你可以试试类似的东西。
    • 好的。我不确定,但你有没有尝试过类似的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多