【问题标题】:Why does the ESAPI ClickjackFilter have to come after the SiteMesh filter?为什么 ESAPI ClickjackFilter 必须在 SiteMesh 过滤器之后?
【发布时间】:2015-08-19 19:42:44
【问题描述】:

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

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

【问题讨论】:

  • 通常 xml 是按指定的顺序处理的,所以可能发生的是 sitemesh 为该标题设置了自己的选项,这就是为什么如果 clickjack 过滤器首先加载,它的设置可能会被 sitemesh 的选项。

标签: java owasp sitemesh esapi clickjacking


【解决方案1】:

在我看来,我认为是因为 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 错误报告。

【讨论】:

  • 我认为你在正确的轨道上。但是,如果我创建一个自定义类,使用在 owasp.org/index.php/ClickjackFilter_for_Java_EE 上宣传的相同代码(但使用不同的包),那么这似乎也有效。只有当我使用出现在 SiteMesh 之前的开箱即用 ClickjackFilter 时,标题才会出现。
  • 是的,我认为这也可以。另外,我可能应该在上面的示例中使用 HttpServletResponse.setHeader() 而不是 addHeader() 来确保如果过滤器链中的任何中间 JavaEE 过滤器添加了 X-FRAME-OPTIONS,这将覆盖它。这不太可能,但有可能,并且只会导致两种使用不同模式的混淆。我想链中稍后的过滤器可以做同样的事情(使用相同的 X-FRAME-OPTIONS 标头再次调用 setHeader() 或 addHeader()),但是如果您要使用过滤器,您可能应该有一些了解它在做什么。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2021-08-13
    • 1970-01-01
    • 2015-07-15
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多