但是,在我的应用程序中,所有 jsps 都使用如下所示的 spring 表单标签,-6ren">
gpt4 book ai didi

java - spring 表单标签的 ESAPI 实现

转载 作者:行者123 更新时间:2023-12-02 06:19:11 25 4
gpt4 key购买 nike

我们如何使用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 标签进行了一些研究之后,似乎数据绑定(bind)发生在框架代码中,从而阻止您在 jsp 中应用任何转义。

其中一个半快速的胜利可能是默认所有输出以转义 HTML。在 web.xml 中添加此条目:

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

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

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

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

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

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

  2. 遵循 @A 之类的解决方案。 Paul 提出,您可以在 Controller 端将上下文转义回来。我知道您认为这不是一个选择,但我提出的下一个解决方案未经测试。

  3. 实现您自己的标记库,该标记库是 [org.springframework.web.servlet.tags.form.InputTag][1] 的子类,具体来说是方法 writeValue 。虽然 esapi 阻止了很多,但我建议查看 owasp 的 new Encoder projec t 向您展示输出编码到底有多么棘手。理想情况下,您的标签库将允许您使用 esapi 的编码器或这个新的 API。

关于java - spring 表单标签的 ESAPI 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21164915/

25 4 0