HTTPQUERY
Русский

X-Frame-Options

Применение

Атаки типа кликджекинг вынуждают пользователей нажимать на скрытые элементы, наложенные поверх легитимной страницы. Злоумышленник встраивает целевой сайт в прозрачный iframe, размещает поверх обманный интерфейс и перехватывает клики, предназначавшиеся содержимому фрейма. X-Frame-Options предотвращает это, сообщая браузеру, разрешено ли ответу отображаться внутри фрейма.

Примечание

X-Frame-Options объявлен устаревшим в пользу директивы CSP frame-ancestors. Все современные браузеры поддерживают frame-ancestors, которая даёт более гранулярный контроль, включая несколько источников и сопоставление схемы. X-Frame-Options по-прежнему широко применяется ради обратной совместимости со старыми браузерами.

Заголовок принимает два действующих значения: DENY и SAMEORIGIN. Третье значение, ALLOW-FROM, было определено в ранних реализациях, но сейчас устарело и игнорируется современными браузерами.

DENY

Значение DENY запрещает отображать страницу в любом фрейме, независимо от запрашивающего сайта. Встраивание во фрейм не допускается ни при каких обстоятельствах.

SAMEORIGIN

Значение SAMEORIGIN разрешает встраивать страницу во фрейм только страницам с тем же источником. Страница на https://example.re может встроить во фрейм другую страницу с https://example.re, но страница с другого источника будет заблокирована.

ALLOW-FROM (устарело)

Значение ALLOW-FROM uri когда-то указывало браузеру разрешать встраивание во фрейм только с указанного URI. Современные браузеры больше не поддерживают эту директиву. Эквивалентная функциональность доступна через директиву CSP frame-ancestors:

Content-Security-Policy: frame-ancestors https://trusted.example.re

Пример

Полный запрет встраивания страницы во фрейм — самая строгая защита от кликджекинга:

X-Frame-Options: DENY

Разрешение встраивания в пределах одного источника с блокировкой внешних сайтов:

X-Frame-Options: SAMEORIGIN

Конфигурация эшелонированной защиты, сочетающая X-Frame-Options с директивой CSP frame-ancestors для широкого охвата браузеров:

X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'

Диагностика

Проблемы со встраиванием проявляются как пустые iframe или ошибки в консоли, когда страница отказывается отрисовываться внутри другого документа.

Ошибка в консоли «Refused to display in a frame». Браузер блокирует страницу во фрейме и записывает в журнал Refused to display ‘https://example.re/’ in a frame because it set ‘X-Frame-Options’ to ‘DENY’ (или ‘SAMEORIGIN’). Проверьте заголовки ответа встраиваемого URL на вкладке Network в DevTools. Если страницу необходимо встраивать, смените значение заголовка с DENY на SAMEORIGIN либо вовсе уберите заголовок и используйте CSP frame-ancestors для более тонкого контроля.

ALLOW-FROM не работает в современных браузерах. Директива ALLOW-FROM устарела. Chrome, Firefox и Safari полностью игнорируют её, трактуя заголовок так, как если бы корректное значение не было задано. Замените ALLOW-FROM директивой CSP frame-ancestors, которая поддерживает несколько источников: Content-Security-Policy: frame-ancestors https://trusted.example.re https://other.example.re.

Конфликт между X-Frame-Options и CSP frame-ancestors. Когда присутствуют оба заголовка, браузеры с поддержкой CSP Level 2 и выше игнорируют X-Frame-Options и следуют только frame-ancestors. Старые браузеры без поддержки CSP опираются на X-Frame-Options. Убедитесь, что задуманная политика согласована в обоих заголовках. Отправка X-Frame-Options: DENY вместе с frame-ancestors ‘self’ создаёт расхождение: современные браузеры разрешают встраивание в пределах одного источника, а устаревшие блокируют любое встраивание.

Блокировка легитимного встраивания (платёжные формы, виджеты, встроенные приложения). Сторонние сервисы, которым требуется встраивание в iframe, перестают работать, если размещающая страница отправляет X-Frame-Options: DENY. Используйте CSP frame-ancestors, чтобы внести в список разрешённых конкретные источники, которым нужен доступ к встраиванию: Content-Security-Policy: frame-ancestors ‘self’ https://payments.provider.example.re.

Переход с X-Frame-Options на CSP frame-ancestors. На переходный период отправляйте оба заголовка. Настройте frame-ancestors в соответствии с задуманной политикой встраивания. Сохраните X-Frame-Options для браузеров без поддержки CSP. Когда доля трафика устаревших браузеров опустится ниже приемлемого порога, удалите X-Frame-Options и полагайтесь только на frame-ancestors. Проверьте миграцию, встроив страницу в iframe с разрешённого источника и убедившись, что фрейм загружается в нескольких браузерах.