为什么ESAPI ClickjackFilter必须在SiteMesh过滤器之后?

时间:2015-06-05 00:57:02

标签: java owasp sitemesh esapi clickjacking

我们有一个使用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>

为什么这两个过滤器的排序很重要?

2 个答案:

答案 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