0

我们有一个使用 OpenSymphony SiteMesh 组装页面的应用程序,并且我们添加了 OWASP ESAPI ClickjackFilter 以将 X-FRAME-OPTIONS 标头添加到响应中。

但是,它仅在 ClickjackFilter 映射出现在 web.xml 中的 SiteMeshFilter 映射之后才有效。如果点击劫持过滤器先出现,则不会添加 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>

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

4

2 回答 2

0

在我看来,我认为是因为 ESAPIClickjackFilter'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 );
        }

如果以这种方式编写,我认为无论应用的顺序如何,它都应该起作用。

警告:请注意,我根本没有验证这一点(事实上,我什至没有尝试编译它!),但我认为这可能是错误的。理论上,SiteMesh 过滤器也可以做一些时髦的事情,但我认为这不太可能。如果有人确认这是错误的,请告诉我,我将提交一份 ESAPI 错误报告。

于 2015-06-06T21:37:02.573 回答
0

看起来已经有一个针对此的错误提交(有一个假设的修复,顺便说一句,我没有测试或以其他方式确认)。错误 ID 为 289。详细信息位于:https ://github.com/ESAPI/esapi-java-legacy/issues/289

于 2015-09-02T02:39:43.160 回答