我们有一个使用OpenSymphony SiteMesh组合页面的应用程序,我们添加了OWASP ESAPI ClickjackFilter,将X-FRAME-OPTIONS标题添加到响应中。
但是,仅当ClickjackFilter映射位于web.xml中的SiteMeshFilter映射之后,它才有效。如果首先是clickjacking过滤器,则不会添加X-FRAME-OPTIONS标头。
这有效:
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/web/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Clickjacking filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这不起作用:
<filter-mapping>
<filter-name>Clickjacking filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/web/*</url-pattern>
</filter-mapping>
为什么这两个过滤器的排序很重要?
答案 0 :(得分:0)
在我看来,我认为这是因为ESAPI ClickjackFilter's doFilter()
方法编写错误。它实现如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletResponse res = (HttpServletResponse)response;
chain.doFilter(request, response);
res.addHeader("X-FRAME-OPTIONS", mode );
}
但是,因为它是 输出 过滤器,所以它应该首先使用HttpServletResponseWrapper
之类的内容包装响应。我认为应该写成这样的东西:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletResponse res =
new javax.servlet.http.HttpServletResponseWrapper(
(HttpServletResponse)response );
chain.doFilter(request, res);
res.addHeader("X-FRAME-OPTIONS", mode );
}
如果以这种方式编写,我认为无论应用的顺序如何,它都应该有效。
CAVEAT :请注意,我根本没有对此进行验证(事实上,我甚至没有尝试过编译它!),但我认为这很可能是什么错误。从理论上讲,SiteMesh过滤器也可以做一些时髦的事情,但我认为这样做的可能性较小。如果有人确认这是错的,请告诉我,我将提交ESAPI错误报告。
答案 1 :(得分:0)
看起来已经有一个针对此的错误(带有假定的修复,BTW,我没有测试或以其他方式确认)。错误ID为289.详细信息:https://github.com/ESAPI/esapi-java-legacy/issues/289