Можно ли настроить Tomcat 7 для вставки HTTP-заголовка Content-Security-Policy?

Можно ли настроить Tomcat 7 для вставки HTTP-заголовка Content-Security-Policy: frame-ancestors 'self' с каждым ответом, например, он может вставлять другие заголовки, связанные с безопасностью, например X-Frame-Options?


person Peter Klimczak    schedule 18.05.2016    source источник


Ответы (1)


Когда это невозможно сделать с помощью встроенных фильтров 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);
    }
}

Создание пользовательского клапана в вашем Tomcat

Еще один вариант — индивидуальный клапан. Цитируя шаги с этой страницы:

  1. Создайте Java-приложение Maven.

  2. Добавьте следующую зависимость:

<dependency>
    <groupid>org.apache.tomcat</groupId>
    <artifactid>tomcat-catalina</artifactId>
    <version>7.0.34</version>
    <scope>provided</scope>
 </dependency>
  1. Create your Java class and extend it from ValveBase.

  2. Реализовать invoke(Request, Response).

  3. Создайте файл библиотеки (.jar)

  4. Установите библиотеку в каталог ${tomcat.home}/lib.

  5. Настройте server.xml для использования вашего нового клапана. Например:

<valve className="com.example.MyValve"/>
  1. Запустите сервер, чтобы увидеть ваш новый клапан в действии.

Your valve implementation could be like:

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);
    }
}
person cassiomolin    schedule 18.05.2016
comment
Спасибо за ответ. Я должен был упомянуть без изменения кода. - person Peter Klimczak; 18.05.2016
comment
@PeterKlimczak Я думаю, что специальный клапан может помочь. Я обновлю свой ответ. - person cassiomolin; 18.05.2016