Кратко
- Заголовок
X-Frame-Options: SAMEORIGINпозволял странице запретить чужим сайтам показывать её в рамке. RFC 7034 в 2013 году описал слабое место: некоторые браузеры сравнивали защищённую страницу только с самым верхним окном. - Страница A включает B, а B включает защищённую страницу A. Проверка концов находит A и A, пропуская B посередине. Директива W3C
frame-ancestorsв 2016 году потребовала смотреть на каждого предка.
Третья страница между двумя одинаковыми
Внешняя страница принадлежит сайту A. Она открывает рамку со страницей B. B пытается вставить в свою рамку чувствительную страницу A. Та отправляет X-Frame-Options: SAMEORIGIN: браузер должен разрешить встраивание только со своего источника. Если программа сравнивает защищённую страницу лишь с верхней, она видит A по обе стороны и разрешает загрузку. Между ними находится B, который непосредственно окружает защищённое содержимое.
Эту схему описал RFC 7034, опубликованный в октябре 2013 года. Информационный документ фиксировал применение заголовка и различия между реализациями того времени. Заголовок защищал от перехвата клика: злоумышленник может наложить интерфейс одной страницы на кнопки другой и заставить человека нажать не туда, куда он думал. Пример подтверждения покупки в RFC служил иллюстрацией защиты. Последовательность A/B/A объясняла механизм, а не называла магазин, пострадавший от атаки.
Сервер установил границу; браузер недосмотрел
Защищаемый сервер посылал правило в HTTP-ответе. DENY запрещал любые рамки, SAMEORIGIN разрешал тот же источник, ALLOW-FROM указывал один разрешённый источник. Браузер приводил правило в действие. Когда рамок несколько, важен способ проверки происхождения каждой страницы.
RFC сообщал, что браузеры выполняли её по-разному. Некоторые сопоставляли защищённую страницу с верхним документом и не проверяли промежуточную рамку. Правильный заголовок был на месте. Код не дошёл до каждого узла дерева. Совпадение двух концов не доказывает, что весь путь принадлежит одному владельцу.
Проверить каждого предка
Рекомендация W3C Content Security Policy Level 2 от декабря 2016 года определила frame-ancestors. Перед загрузкой ресурса в рамку браузер составляет список всех родительских окон. URL каждой страницы сравнивается с разрешёнными источниками. Первое несовпадение прекращает загрузку. В A/B/A страница B проваливает проверку, хотя верхняя A подходит.
Текст W3C напрямую противопоставил эту проверку поведению многих реализаций старого SAMEORIGIN, смотревших только наверх. Он объявил frame-ancestors заменой X-Frame-Options и рекомендовал применять CSP, если присланы оба правила. Новая директива допускала несколько источников. Главное изменение заключалось в проверке всей цепочки.
Даже верное правило должно быть доставлено правильно. RFC уточнял: X-Frame-Options в теге meta http-equiv браузер игнорирует, нужен HTTP-заголовок. W3C также исключил frame-ancestors из политик, заданных через meta. Общее default-src 'none' само по себе не запрещает вложенные окна. Оператору надо указать именно правило об окружающих страницах в ответе, который браузер исполняет.
Владелец страницы задаёт круг тех, кто вправе окружить её. Полную картину рамок видит только браузер посетителя. Письменное правило становится реальной границей, когда программа доходит до каждого промежуточного окна.
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров





