Перейти к содержимому

X frame options что это

  • автор:

Атака типа clickjacking

Атака типа clickjacking (англ. «захват клика») позволяет вредоносной странице кликнуть по сайту-жертве от имени посетителя.

Многие сайты были взломаны подобным способом, включая Twitter, Facebook, Paypal и другие. Все они, конечно же, сейчас защищены.

Идея

Идея этой атаки очень проста.

Вот как clickjacking-атака была проведена на Facebook:

  1. Посетителя заманивают на вредоносную страницу (неважно как).
  2. На странице есть ссылка, которая выглядит безобидно (например, «Разбогатей прямо сейчас» или «Нажми здесь, это очень смешно»).
  3. Поверх этой ссылки вредоносная страница размещает прозрачный с src с сайта facebook.com таким образом, что кнопка «like» находится прямо над этой ссылкой. Обычно это делается с помощью z-index в CSS.
  4. При попытке клика на эту ссылку посетитель на самом деле нажимает на кнопку.

Демонстрация

Вот как выглядит вредоносная страница. Для наглядности полупрозрачный (на реальных вредоносных страницах он полностью прозрачен):

  
Нажми, чтобы разбогатеть:
. И всё будет супер (у меня, хакера)!

Полная демонстрация атаки:

facebook.html

     iframe 
Нажми, чтобы разбогатеть:
. И всё будет супер (у меня, хакера)!

Здесь у нас есть полупрозрачный , и в примере мы видим его висящим поверх кнопки. Клик на кнопку фактически кликает на ифрейм, но этого не видно пользователю, потому что ифрейм прозрачный.

В результате, если пользователь авторизован на сайте Facebook («Запомнить меня» обычно активировано), то он добавляет «лайк». В Twitter это будет кнопка «читать», и т.п.

Вот тот же пример, но более приближенный к реальности с opacity:0 для :

facebook.html

     iframe 
Нажми, чтобы разбогатеть:
. И ты крутой (вообще-то я крутой хакер)!

Всё, что нам необходимо для атаки — это расположить на вредоносной странице так, чтобы кнопка находилась прямо над ссылкой. Так что пользователь, кликающий по ссылке, на самом деле будет нажимать на кнопку в . Обычно это можно сделать с помощью CSS-позиционирования.

Clickjacking-атака для кликов мыши, а не для клавиатуры

Эта атака срабатывает только на действия мыши (или аналогичные, вроде нажатия пальцем на мобильном устройстве).

Клавиатурный ввод гораздо сложнее перенаправить. Технически, если у нас есть текстовое поле для взлома, мы можем расположить ифрейм таким образом, чтобы текстовые поля перекрывали друг друга. Тогда посетитель при попытке сфокусироваться на текстовом поле, которое он видит на странице, фактически будет фокусироваться на текстовом поле внутри ифрейм.

Но есть одна проблема. Всё, что посетитель печатает, будет скрыто, потому что ифрейм не виден.

Обычно люди перестают печатать, когда не видят на экране новых символов.

Примеры слабой защиты

Самым старым вариантом защиты является код JavaScript, запрещающий открытие страницы во фрейме (это называют «framebusting»).

Выглядит он вот так:

if (top != window)

В этом случае, если окно обнаруживает, что оно открыто во фрейме, оно автоматически располагает себя сверху.

Этот метод не является надёжной защитой, поскольку появилось множество способов его обойти. Рассмотрим некоторые из них.

Блокировка top-навигации

Мы можем заблокировать переход, вызванный сменой top.location в обработчике события beforeunload.

Внешняя страница (принадлежащая хакеру) устанавливает обработчик на это событие, отменяющий его, например, такой:

window.onbeforeunload = function() < return false; >;

Когда iframe пытается изменить top.location , посетитель увидит сообщение с вопросом действительно ли он хочет покинуть эту страницу. В большинстве случаев посетитель ответит отрицательно, поскольку он не знает об ифрейме: всё, что он видит – это верхнюю страницу, которую нет причин покидать. Поэтому top.location не изменится!

iframe.html

    
Замена top.location на javascript.info
     iframe   

После клика на кнопку пользователь получает "странный" вопрос о том, хочет ли он покинуть данную страницу.

Скорее всего, он ответит "нет", и защита ифрейм будет взломана.

Атрибут «sandbox»

Одним из действий, которые можно ограничить атрибутом sandbox , является навигация. Соответственно ифрейм внутри sandbox не изменит top.location .

Поэтому мы можем добавить ифрейм с sandbox=»allow-scripts allow-forms» . Это снимет некоторые ограничения, разрешая при этом использование скриптов и форм. Но мы опускаем allow-top-navigation , чтобы изменение top.location было запрещено.

Вот код этого примера:

Есть и другие способы обойти эту простую защиту.

Заголовок X-Frame-Options

Заголовок X-Frame-Options со стороны сервера может разрешать или запрещать отображение страницы внутри фрейма.

Это должен быть именно HTTP-заголовок: браузер проигнорирует его, если найдёт в HTML-теге . Поэтому при ничего не произойдёт.

Заголовок может иметь 3 значения:

DENY Никогда не показывать страницу внутри фрейма. SAMEORIGIN Разрешить открытие страницы внутри фрейма только в том случае, если родительский документ имеет тот же источник. ALLOW-FROM domain Разрешить открытие страницы внутри фрейма только в том случае, если родительский документ находится на указанном в заголовке домене.

Например, Twitter использует X-Frame-Options: SAMEORIGIN .

В зависимости от того, какой браузер вы используете, iframe выше либо будет пустым, либо оповестит вас о том, что его невозможно отобразить.

Отображение с ограниченными возможностями

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

Так что есть другие решения… Например, мы можем «накрыть» страницу блоком со стилями height: 100%; width: 100%; , чтобы он перехватывал все клики. Этот будем убирать, если window == top или если мы поймём, что защита нам не нужна.

 #protector 
Перейти к сайту
// Здесь будет отображаться ошибка, если верхнее окно имеет другое происхождение // а здесь будет код, если всё в порядке if (top.document.domain == document.domain)

iframe.html

     #protector 
Перейти к сайту
if (top.document.domain == document.domain) Этот текст всегда виден. Но если страница была открыта внутри документа, принадлежащего другому домену, div поверх неё предотвратит любые действия.

Атрибут cookie: samesite

Атрибут samesite также может помочь избежать clickjacking-атаки.

Файл куки с таким атрибутом отправляется на сайт только в том случае, если он открыт напрямую, не через фрейм или каким-либо другим способом. Подробно об этом – в главе Куки, document.cookie.

Если сайт, такой как Facebook, при установке авторизующего куки ставит атрибут samesite :

Set-Cookie: authorization=secret; samesite

… Тогда такие куки не будут отправляться, когда Facebook будет открыт в ифрейме с другого сайта. Так что атака не удастся.

Атрибут samesite не играет никакой роли, если куки не используются. Так что другие веб-сайты смогут отображать публичные, не требующие авторизации, страницы в ифрейме.

Однако, это даёт возможность в некоторых ситуациях осуществить clickjacking-атаку, например, на сайт для анонимных опросов, который предотвращает повторное голосование пользователя путём проверки IP-адреса. Он останется уязвимым к атаке, потому что не аутентифицирует пользователей с помощью куки.

Итого

Атака сlickjacking – это способ хитростью «заставить» пользователей кликнуть на сайте-жертве, без понимания, что происходит. Она опасна, если по клику могут быть произведены важные действия.

Хакер может разместить ссылку на свою вредоносную страницу в сообщении или найти другие способы, как заманить пользователей. Вариантов множество.

С одной стороны — эта атака «неглубокая», ведь хакер перехватывает только один клик. Но с другой стороны, если хакер знает, что после этого клика появятся другие элементы управления, то он может хитростью заставить пользователя кликнуть на них.

Этот вид атаки довольно опасен, ведь при разработке интерфейсов мы не предполагаем, что хакер может кликнуть от имени пользователя. Поэтому уязвимости могут быть обнаружены в совершенно неожиданных местах.

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

Устранение фрамесниффинг с помощью заголовка X-Frame-Options

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

Сводка

Фрамесниффинг — это способ атаки, который использует преимущества функций браузера для кражи данных с веб-сайта. Веб-приложения, которые позволяют размещать контент в междоменном IFRAME, могут быть подвержены этой атаке.

Администраторы могут уменьшить фрамесниффинг, настроив IIS на отправку HTTP-заголовка ответа, предотвращающего размещение содержимого в междоменном IFRAME.

Дополнительные сведения

Заголовок X-Frame-Options можно использовать для управления расположением страницы в окне IFRAME. Так как метод Фрамесниффинг полагается на возможность размещения сайта-жертвы в окне IFRAME, веб-приложение может защищать себя, отправив соответствующий заголовок X-Frame-Options.

Чтобы настроить IIS на добавление заголовка X-Frame-Options ко всем ответам для определенного сайта, выполните указанные ниже действия.

  1. Откройте диспетчер служб IIS.
  2. В левой части области соединения разверните папку сайты и выберите сайт, который вы хотите защитить.
  3. Дважды щелкните значок заголовки HTTP-ответа в списке компонентов в центре.
  4. На правой стороне панели действий нажмите кнопку Добавить.
  5. В появившемся диалоговом окне введите X-Frame-Options в поле Name (имя) и введите САМЕОРИГИН в поле Value (значение).
  6. Нажмите кнопку OK, чтобы сохранить изменения.

Если у вас есть другие сайты, для которых нужна эта конфигурация, повторите действия 2 – 6 для этих сайтов.

Это изменение не позволит HTML-страницам в других доменах размещать ваш сайт в Интернет-КАДРе. Например, если ИТ-отдел Contoso применяет это изменение к http://contoso.com, страницы на http://fabrikam.com больше не смогут отображать содержимое из http://contoso.com в Интернет-КАДРе.

Вы можете изменить значение заголовка X-Frame-Options, чтобы разрешить http://fabrikam.com кадру http://contoso.com при блокировании всех других доменов. Для этого измените значение заголовка X-Frame-Options в действии 5 на http://fabrikam.com.

Дополнительные сведения о заголовке X-Frame-Options см. в этой записи в блоге MSDN.

Чтобы отменить изменения, выполните указанные ниже действия.

  1. Откройте диспетчер служб IIS.
  2. На панели подключения в левой части экрана разверните папку сайты и выберите сайт, на который вы внесли это изменение.
  3. Дважды щелкните значок заголовки HTTP-ответа в списке компонентов.
  4. В появившемся списке заголовков выберите пункт X-Frame-Options (параметры).
  5. На правой стороне панели действий нажмите кнопку Удалить.

Не работает Вебвизор при включенном X-Frame-Options

Не работает Вебвизор при включенном X-Frame-Options

Владельцем сайтов рекомендуется запрещать отображение страниц во фреймах на сторонних доменах, что защитит от атак типа clickjacking и некоторых других. Особенно актуально это для интернет-магазинов и сервисов.

Примером такой атаки может быть случай, когда под видом надежного сайта, злоумышленник у себя на домене подсовывает пользователям вредоносный код. Вариантов применения масса — подписка на ресурс в социальной сети, кража конфиденциальной информации, совершение покупок в интернет-магазинах за чужой счёт.

И вообще, если вы не YouTube, то не стоит, без видимой причины разрешать кому попало отображать у себя содержимое вашего сайта.

Не единственный, но рекомендуемый на сегодня способ запрета отображения веб-страницы внутри фрейма — использование заголовка X-Frame-Options, однако и он не идеален и иногда приводит к проблемам, например к некорректной работе Вебвизора в Яндекс.Метрике.

Разбираемся как настроить защиту и что делать если проблемы все таки-возникают.

Что такое X-Frame-Options

Заголовок HTTP ответа от сервера X-Frame-Options служит инструкцией для браузера, он разрешает или запрещает отображение страниц вашего сайта во фрейме. Может иметь три значения:

SAMEORIGIN
Разрешает загрузку страниц сайта во фрейме только если фрейм и страница расположены на одном домене.

DENY
Запрещает загрузку во фрейме.

ALLOW-FROM domain
Разрешает загрузку во фрейме только для указанного домена, не работает для Safari и Firefox.

Защита от фреймов в 1С-Битрикс

В 1С-Битрикс ограничение работы во фрейме включается на странице «Защита от фреймов» (Настройки — Проактивная защита — Защита от фреймов).

Защита от фреймов 1С-Битрикс

На вкладке «Исключения», можно указать страницы сайта, для которых ограничения не будут применяться. Также добавить свою страницу в исключения можно определив константу B_SECURITY_FRAME в значение false, до подключения ядра.

Важно! Чтобы данный функционал 1С-Битрикс корректно работал, заголовок X-Frame-Options на сервере должен быть установлен в значение SAMEORIGIN (как это сделать, читайте далее). Если заголовок отсутствует или установлен в значение отличное от рекомендуемого, «Сканер безопасности» 1С-Битрикс расценит это как потенциальную угрозу сайту и будет показывать соответствующее предупреждение в своём журнале.

Сканер безопасности

Как настроить X-Frame-Options на Nginx

1. Найти секцию server, отвечающую за обработку запросов нужного сайта. Как правило это файлы в /etc/nginx/site-enabled/*.conf

Для версий Bitrix VM ниже 7.0 и чистого nginx скорее всего это будет файл /etc/nginx/nginx.conf или etc/nginx/bx/conf/bitrix.conf

Для Bitrix VM 7.0 и выше заголовок вынесен в отдельный файл /etc/nginx/bx/conf/http-add_header.conf

2. В секцию server нужного сайта добавить или закомментировать строку в зависимости от того хотите вы включить использование заголовка или выключить:

add_header X-Frame-Options SAMEORIGIN;
#add_header X-Frame-Options SAMEORIGIN;

3. Перезапустить nginx

systemctl restart nginx.service
service nginx restart

Как настроить X-Frame-Options на Apache

1. Найти конфигурационный файл для вашего сайта, зачастую это файлы /etc/apache2/httpd.conf, /etc/apache2/vhost.d/*.conf

2. Добавить или закомментировать строки в зависимости от того хотите вы включить использование заголовка или выключить:

 Header set X-Frame-Options SAMEORIGIN 
 #Header set X-Frame-Options SAMEORIGIN 

3. Перезапустить Apache

Либо внести эти же инструкции в файл .htaccess, при этом перезапуск сервера не требуется.

Решение проблем

Если вы используете сервисы, которым необходимо открытие вашего сайта во фрейме то ограничение работы во фрейме скорее всего приведёт к тому, что эти сервисы перестанут работать или будут работать некорректно.

Самой известной проблемой является некорректная работа Вебвизора от Яндекс. Данные собираются валидно, но при попытке просмотреть запись посещения возникает ошибка: «Невозможно воспроизвести посещение на данной странице. Возможные причины: Не установлен код счётчика или установлен запрет на отображение страницы во фрейме.»

Варианты добавления в конфиги исключений сводят всю идею X-Frame-Options на ноль, так как могут быть легко подделаны. Поэтому варианты типа приведенного ниже могут использоваться, но не рекомендуются.

location / < set $frame_options ''; if ($http_referer !~ '^https?:\/\/([^\/]+\.)?(yourdomain\.com|webvisor\.com)\/')< set $frame_options 'SAMEORIGIN'; >add_header X-Frame-Options $frame_options; . >

Для решения проблемы вам придётся сделать выбор: либо сервис (в данном случае вебвизор), либо безопасность, других вариантов пока к сожалению не существует.

Полезные ссылки

На этом всё. Но вы можете поддержать проект. Даже небольшая сумма поможет нам писать больше полезных статей.

Если статья помогла или понравилась, пожалуйста поделитесь ей в соцсетях.

X-Frame-Options

The X-Frame-Options HTTP response header can be used to indicate whether a browser should be allowed to render a page in a , , or . Sites can use this to avoid click-jacking attacks, by ensuring that their content is not embedded into other sites.

The added security is provided only if the user accessing the document is using a browser that supports X-Frame-Options .

Warning: The Content-Security-Policy HTTP header has a frame-ancestors directive which obsoletes this header for supporting browsers.

Header type Response header
Forbidden header name no

Syntax

There are two possible directives for X-Frame-Options :

X-Frame-Options: DENY X-Frame-Options: SAMEORIGIN 

Directives

If you specify DENY , not only will the browser attempt to load the page in a frame fail when loaded from other sites, attempts to do so will fail when loaded from the same site. On the other hand, if you specify SAMEORIGIN , you can still use the page in a frame as long as the site including it in a frame is the same as the one serving the page.

The page cannot be displayed in a frame, regardless of the site attempting to do so.

The page can only be displayed if all ancestor frames are same origin to the page itself.

This is an obsolete directive. Modern browsers that encounter response headers with this directive will ignore the header completely. The Content-Security-Policy HTTP header has a frame-ancestors directive which you should use instead.

Examples

Configuring Apache

To configure Apache to send the X-Frame-Options header for all pages, add this to your site’s configuration:

apacheconf

Header always set X-Frame-Options "SAMEORIGIN" 

To configure Apache to set X-Frame-Options to DENY , add this to your site’s configuration:

apacheconf

Header set X-Frame-Options "DENY" 

Configuring Nginx

To configure Nginx to send the X-Frame-Options header, add this either to your http, server or location configuration:

add_header X-Frame-Options SAMEORIGIN always; 

You can set the X-Frame-Options header to DENY using:

add_header X-Frame-Options DENY always; 

Configuring IIS

To configure IIS to send the X-Frame-Options header, add this to your site’s Web.config file:

system.webServer>httpProtocol> customHeaders> add name="X-Frame-Options" value="SAMEORIGIN" /> customHeaders> httpProtocol>system.webServer> 

Configuring HAProxy

To configure HAProxy to send the X-Frame-Options header, add this to your front-end, listen, or backend configuration:

rspadd X-Frame-Options:\ SAMEORIGIN

Alternatively, in newer versions:

http-response set-header X-Frame-Options SAMEORIGIN

Configuring Express

You can use Helmet to configure an Express app to set the legacy X-Frame-Options header on old browsers.

Warning: It’s recommended to use the Content-Security-Policy HTTP header with the frame-ancestors directive instead.

To use Helmet to set X-Frame-Options , add the following to your server configuration to set the SAMEORIGIN directive:

const helmet = require("helmet"); const app = express(); app.use( helmet( xFrameOptions:  action: "sameorigin" >, >), ); 

Specifications

Specification
HTML Standard
# the-x-frame-options-header

Browser compatibility

BCD tables only load in the browser

See also

  • Content-Security-Policy directive frame-ancestors
  • ClickJacking Defenses — IEBlog
  • Combating ClickJacking with X-Frame-Options — IEInternals

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on Dec 12, 2023 by MDN contributors.

Your blueprint for a better internet.

MDN

Support

  • Product help
  • Report an issue

Our communities

Developers

  • Web Technologies
  • Learn Web Development
  • MDN Plus
  • Hacks Blog
  • Website Privacy Notice
  • Cookies
  • Legal
  • Community Participation Guidelines

Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2024 by individual mozilla.org contributors. Content available under a Creative Commons license.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *