Как политика Content-Security-Policy работает с параметрами X-Frame?

Отказывает ли Content-Security-Policy игнорировать X-Frame-Options, возвращенный сервером, или X-Frame-Options все еще первичный?

Предполагая, что у меня есть:

  • веб-сайт http://a.com с X-Frame-Options: DENY
  • и веб-сайт http://b.com с Content-Security-Policy: frame-src a.com

браузер загрузит этот кадр?

Непонятно.
С одной стороны, http://a.com явно отрицает обрамление.
С другой стороны, http://b.com явно позволяет создавать рамки для http://a.com.

Ответ 1

CSP-директива frame-src (которая устарела и заменена на child-src) определяет, какие источники можно использовать во фрейме на странице.

С другой стороны, заголовок ответа X-Frame-Options определяет, какие другие страницы могут использовать эту страницу в iframe.

В вашем случае http://a.com с X-Frame-Options: DENY указывает, что никакая другая страница не может использовать его во фрейме. Неважно, что http://b.com имеет в своем CSP - ни одна страница не может использовать http://a.com во фрейме.


Место, где X-Frame-Options пересекается с CSP, - это директива frame-ancestors. Из спецификации CSP (выделено мое):

Эта директива похожа на заголовок X-Frame-Options который реализовали несколько пользовательских агентов. Выражение источника 'none' примерно эквивалентно заголовкам DENY, 'self' для SAMEORIGIN и так далее. Основное отличие состоит в том, что многие пользовательские агенты реализуют SAMEORIGIN, что он сопоставляется только с местоположением документов верхнего уровня. Эта директива проверяет каждого предка. Если какой-либо предок не совпадает, загрузка отменяется. [RFC7034]

Директива frame-ancestors отменяет заголовок X-Frame-Options. Если у ресурса есть обе политики, ДОЛЖНА применяться политика frame-ancestors политика X-Frame-Options СЛЕДУЕТ игнорировать.

Более старый вопрос показал, что в то время это не работало в Firefox, но, надеюсь, сейчас все изменилось.


ОБНОВЛЕНИЕ Апрель 2018 года:

Политика безопасности контента: Директива child-src устарела. Пожалуйста, используйте директиву 'worker-src для управления работниками, или директиву' frame-src для управления кадрами соответственно.

Похоже, child-src теперь устарел, а frame-src вернулся.

Ответ 2

Ни одна из ваших гипотез не является универсально верной.

  • Chrome игнорирует X-Frame-Options.
  • Safari 9 и ниже игнорируют frame-ancestors CSP.
  • Safari 10-12 уважает директиву CSP frame-ancestors, но приоритет X-Frame-Options если указаны оба.

Ответ 3

Ответ был найден путем тестирования на практике.
Я создал два веб-сайта и воспроизвел описанную ситуацию.

Похоже, что X-Frame-Options является основным.
Если целевой сервер отказывает в кадрировании, то веб-сайт клиента не может отображать эту страницу в iframe в зависимости от того, какие значения Content-Security-Policy установлены.

Однако я не нашел никаких подтверждений в документации.

Протестировано на Chrome 54 и IE 11.