一尘不染

Spring表单标签的ESAPI实现

jsp

我们如何使用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实现?还有其他实现输出编码的方法,例如创建过滤器或其他方法?任何建议,不胜感激!


阅读 522

收藏
2020-06-10

共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
tag属性覆盖这些部分。

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

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

  1. 使用JSTL标记而不是Spring标记,因此您可以使用编写变量${thisSyntax}并将其包装在esapi标记中,如下所示:

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

  1. 遵循@A之类的解决方案。Paul提出了,您在哪里进行上下文回溯到控制器端。我知道您觉得这不是一个选择,但是我提出的下一个解决方案未经测试。

  2. 实现自己的子库[org.springframework.web.servlet.tags.form.InputTag][1],特别是方法的子类writeValue。尽管esapi可以防止很多情况,但我还是建议您查看owasp的新Encoder项目,以向您确切显示输出编码的技巧。理想情况下,您的标签库将允许您使用esapi的编码器或此新API。

2020-06-10