弹簧形式标签的ESAPI实现

时间:2014-01-16 14:44:09

标签: java jsp spring-mvc esapi

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

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

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

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

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

如何为上述代码实施ESAPI?有没有其他方法来实现输出编码,如创建过滤器或什么?非常感谢任何建议!

2 个答案:

答案 0 :(得分:1)

只是想一想这是不是你想要的。

您可以在Java中使用以下代码并更改bean本身的数据,然后发送用户界面。

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

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

答案 1 :(得分: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标记中,如下所示:

    <c:out value="<esapi:encodeForHTML>${variable}</esapi:encodeForHTML>"/>

  2. 按照像@A这样的解决方案。 Paul提出,在那里你可以将你的环境转移到控制器端。我知道你觉得这不是一个选择,但我提出的下一个解决方案是未经测试的。

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