可以将Tomcat 7配置为插入"Content-Security-Policy"HTTP标头吗?

Pet*_*zak 8 security http tomcat7

可以将Tomcat 7配置为Content-Security-Policy: frame-ancestors 'self'在每个响应中插入HTTP标头,例如它可以插入其他安全相关的标头X-Frame-Options吗?

cas*_*lin 10

使用Tomcat 7.x内置过滤器无法实现后,您可以尝试以下选项之一:

在应用程序中创建过滤器

如果向应用程序添加过滤器是一个选项,则可以使用以下代码为每个响应添加标头:

@WebFilter("/*")
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {

        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setHeader("Content-Security-Policy", "frame-ancestors 'self'");

        chain.doFilter(request, response);
    }
}
Run Code Online (Sandbox Code Playgroud)

在Tomcat中创建自定义阀门

另一种选择是定制阀门.引用此页面中的步骤:

  1. 创建Maven Java应用程序.

  2. 添加以下依赖项:

<dependency>
    <groupid>org.apache.tomcat</groupId>
    <artifactid>tomcat-catalina</artifactId>
    <version>7.0.34</version>
    <scope>provided</scope>
 </dependency>
Run Code Online (Sandbox Code Playgroud)
  1. 创建Java类并从中扩展它ValveBase.

  2. 实施invoke(Request, Response)方法.

  3. 构建你的library(.jar)文件

  4. ${tomcat.home}/lib目录中安装库.

  5. 配置server.xml使用新阀门.例如:

<valve className="com.example.MyValve"/>
Run Code Online (Sandbox Code Playgroud)
  1. 启动服务器以查看新阀门的运行情况

您的阀门实施可能如下:

public class MyValve extends ValveBase {

    @Override
    public void invoke(Request request, Response response) throws IOException, 
                                                                  ServletException {

        HttpServletResponse httpResponse = response.getResponse();
        httpResponse.setHeader("Content-Security-Policy", "frame-ancestors 'self'");

        getNext().invoke(request, response);
    }
}
Run Code Online (Sandbox Code Playgroud)