我们有一个使用OpenSymphony SiteMesh来组装页面的应用程序,我们已经添加了OWASP来将X帧选项头添加到响应中。
但是,只有当ClickjackFilter映射在web.xml中的SiteMeshFilter映射之后才能工作。如果首先使用点击筛选器,则不添加X帧选项头。
这样做是可行的:
<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>为什么这两个过滤器的顺序很重要?
发布于 2015-06-06 21:37:02
在我看来,我认为这是因为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 );
}如果它是这样写的话,我认为无论应用的顺序如何,它都应该起作用。
警告:请注意,我根本没有验证这一点(实际上,我甚至没有尝试编译它!),但我认为这可能是错误的。理论上,SiteMesh过滤器也可以做一些奇怪的事情,但我认为这不太可能。如果有人确认这是问题所在,请告诉我,我会提交一份ESAPI错误报告。
发布于 2015-09-02 02:39:43
看起来已经有一个针对此的bug (使用了一个假定的修复,BTW,我还没有测试或以其他方式确认)。错误ID是289。详细信息:https://github.com/ESAPI/esapi-java-legacy/issues/289
https://stackoverflow.com/questions/30656658
复制相似问题