0

我们如何使用 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 实现?有没有其他实现输出编码的方法,比如创建一个过滤器之类的?任何建议都非常感谢!

4

2 回答 2

1

只是一个想法,不确定这是否是您正在寻找的。

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

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

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

于 2014-01-20T14:33:13.170 回答
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"需要时使用 form 标记属性覆盖那些部分。

您需要的是能够挂钩将 HTML 绑定到表单的 Spring 标记部分,但您需要能够做到这一点,以便您可以根据放置的位置进行转义。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 的新编码器项目,以准确地向您展示输出编码是多么棘手。理想情况下,您的标签库将允许您使用 esapi 的编码器或这个新的 API。

于 2014-10-17T00:46:38.497 回答