К содержанию

Wiki · Вредоносные технологии

Кликджекинг

Кликджекинг (clickjacking, «угон клика») – это атака, при которой страницу вашего сайта загружают в невидимый фрейм на чужом сайте и подкладывают под безобидную кнопку. Человек думает, что нажимает «Получить приз», а на деле кликает по кнопке на вашем сайте.

Атака не взламывает сайт и не крадёт пароли. Она использует то, что посетитель уже вошёл в личный кабинет. Браузер честно открывает вашу страницу от его имени, а злоумышленник лишь подсовывает её под курсор. Поэтому защищаться приходится на стороне сайта: запретить показывать его страницы внутри чужих.

Как прозрачный фрейм перехватывает клик

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

Схема кликджекинга: под кнопкой приманки лежит прозрачный фрейм с сайтом, клик посетителя выполняет действие с его правами
Как работает кликджекинг

Если человек в этот момент авторизован на вашем сайте, действие выполнится с его правами. Сайт видит обычный клик настоящего пользователя и не может отличить его от честного. Так можно:

  • Подтвердить действие в личном кабинете: подписку, смену настроек, удаление данных.
  • Оформить заказ, если на сайте есть покупка в один клик.
  • Нажать «Нравится» или «Подписаться» в соцсети. Эту разновидность называют лайкджекингом.
  • Выполнить действие в админке CMS, если её открыл администратор.

Сильнее всего рискуют сайты с авторизацией и действиями в один клик: личные кабинеты, интернет-магазины, сервисы, админки. Для визитки без входа риск невелик, но защита настраивается за несколько минут, поэтому её ставят всем.

Заголовки, которые запрещают показ во фрейме

Основу защиты дают HTTP-заголовки: увидев их, браузер не покажет страницу во фрейме на чужом сайте.

ЗаголовокЗначениеЧто делает
X-Frame-OptionsDENYзапрещает показ во фрейме везде
X-Frame-OptionsSAMEORIGINразрешает фреймы только на вашем же сайте
Content-Security-Policyframe-ancestors 'self'то же, что SAMEORIGIN, но можно перечислить доверенные домены

Современный способ задать запрет: директива frame-ancestors в заголовке Content-Security-Policy. X-Frame-Options ставят рядом для совместимости со старыми браузерами. На nginx это две строки:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self'" always;

Учтите особенность nginx: если в блоке location есть свои директивы add_header, заголовки из блока server туда не наследуются. Поэтому проверяйте заголовки на реальных страницах, а не в конфиге.

В 1С-Битрикс то же самое включается без правки сервера: раздел «Защита от фреймов» модуля «Проактивная защита». По документации он защищает от кликджекинга и снижает риск XSS-атак, а на вкладке исключений можно задать страницы, которые разрешено встраивать.

Сравнение сайта без защиты от кликджекинга и с заголовками Content-Security-Policy frame-ancestors и X-Frame-Options
Сайт без защиты и с защитой

Заголовки стоит подкрепить настройками самого сайта:

  • Cookies сессии с атрибутом SameSite=Lax или Strict браузер не отправляет во фрейм на чужом сайте, и пользователь там окажется не авторизован.
  • Важные действия подтверждайте паролем или кодом: удаление аккаунта, смену почты, крупный заказ.
  • Не делайте опасные действия в один клик без второго шага.

Когда фреймы всё-таки нужны

Полный запрет иногда ломает полезные вещи: виджет калькулятора на сайтах партнёров, встраивание формы на лендинг, предпросмотр страниц в сервисах аналитики. Яндекс Метрика прямо пишет: если сайт защищён от показа во фрейме заголовком X-Frame-Options, данные карт и Вебвизора будут недоступны для просмотра. В справке Метрики есть пример настройки nginx с исключением для её доменов. В таких случаях не отключайте защиту целиком, а разрешите встраивание только нужным доменам через frame-ancestors или исключения в Битриксе.

Почему запрет фреймов не срабатывает

  • Указать X-Frame-Options со значением ALLOW-FROM. Современные браузеры его не поддерживают, для списка доменов нужен frame-ancestors.
  • Прописать запрет в мета-теге страницы. Ни X-Frame-Options, ни frame-ancestors так не работают, их нужно отдавать заголовком ответа сервера.
  • Защитить главную и забыть про личный кабинет и админку.

Как проверить защиту от фреймов на своём сайте

  1. Откройте любую страницу, во вкладке Network инструментов разработчика выберите документ и найдите в заголовках ответа X-Frame-Options и Content-Security-Policy.
  2. Проверьте несколько типов страниц: главную, карточку товара, личный кабинет, админку. Заголовки часто стоят не везде.
  3. После включения защиты убедитесь, что работают карты Метрики, виджеты и встроенные формы.
Чек-лист проверки защиты от кликджекинга: заголовки X-Frame-Options и CSP frame-ancestors на всех страницах, работа Метрики, SameSite
Как проверить защиту от кликджекинга

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

Настройка запрета фреймов: заголовки, исключения, Вебвизор

Чем X-Frame-Options отличается от frame-ancestors?

Гибкостью. X-Frame-Options умеет только запретить фреймы совсем или пустить их на собственный домен, а frame-ancestors в Content-Security-Policy принимает список разрешённых сайтов. Если пришли оба заголовка, современный браузер слушается frame-ancestors, а старый читает X-Frame-Options.

Почему не работает значение ALLOW-FROM?

Актуальные версии браузеров его игнорируют, и страница спокойно открывается во фрейме на любом сайте. Список доверенных доменов задают только через frame-ancestors.

Почему заголовок прописан в nginx, а на части страниц его нет?

Чаще всего у этих адресов есть свой блок location с собственными add_header, и заголовки уровня server туда не попадают. Вторая причина: без параметра always nginx добавляет заголовок только к успешным ответам и редиректам, а страницы ошибок уходят без него. Поэтому смотрите ответ сервера в браузере на разных типах страниц, а не файл конфигурации.

Как закрыть сайт от фреймов без доступа к конфигурации nginx?

На Apache хватит строки Header always set X-Frame-Options со значением SAMEORIGIN в .htaccess, если подключён mod_headers. В 1С-Битрикс заголовок отдаёт сама CMS через «Защиту от фреймов». Если сайт обслуживает только nginx, файл .htaccess он не читает, и заголовок добавляет поддержка хостинга.

Что делать, если после запрета фреймов Вебвизор не показывает записи?

Разрешить встраивание доменам Метрики: она проигрывает записи и строит карты, открывая ваш сайт у себя во фрейме. Сделать это можно в frame-ancestors или в исключениях Битрикса, образец конфигурации nginx лежит в справке Метрики.

Как разрешить партнёру встраивать калькулятор с вашего сайта?

Откройте для фреймов только страницу калькулятора и только домену партнёра: в frame-ancestors для этого адреса укажите свой сайт и сайт партнёра. Остальные страницы, особенно личный кабинет и админка, пусть остаются под запретом. В 1С-Битрикс адрес виджета добавляют в исключения раздела «Защита от фреймов».

Каким сайтам кликджекинг опаснее всего?

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

Чем кликджекинг отличается от XSS?

Местом подвоха. При XSS вредный скрипт оказывается внутри вашей страницы и выполняется у посетителя, а при кликджекинге код сайта никто не трогает: вашу страницу прячут под чужой кнопкой. Поэтому и защита разная: от фреймов спасают заголовки, от XSS экранирование вывода и CSP.

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

Документация и справки

См. также: Технический аудит сайта, Хостинг, CMS, Фреймы.

Остались вопросы по теме «Кликджекинг»?

Напишите нам в Telegram или MAX. Ответит специалист, который отвечает за эту тему, или руководитель проектов в рабочее время.

Станислав БарановОтвечает по темеСтанислав БарановРуководитель направления безопасности

Тарифы

Тарифы по теме

Все тарифы →
84 000 ₽/⁠мес

Пакет 20 часов в месяц для работающего сайта: следим за доступностью, делаем копии, восстанавливаем после сбоев и выкладываем контент.

Задачи
Ждем от заказчика
Обновления
Нет
  • Исправление ошибок на сайте
  • Небольшие доработки
  • Размещение контента
  • Учёт часов по каждой задаче
  • Ежемесячный отчёт о задачах
  • Резервная копия перед крупными правками
  • Мониторинг работоспособности сайта
  • Регулярное резервное копирование
164 000 ₽/⁠мес

Пакет 40 часов в месяц: сайт работает стабильно, а команда с дизайнером и разработчиками делает новые функции по вашим задачам.

Задачи
Ждем от заказчика
Обновления
Да
  • Исправление ошибок на сайте
  • Небольшие доработки
  • Размещение контента
  • Учёт часов по каждой задаче
  • Ежемесячный отчёт о задачах
  • Резервная копия перед крупными правками
  • Мониторинг работоспособности сайта
  • Регулярное резервное копирование
320 000 ₽/⁠мес

Пакет 80 часов в месяц для сайтов, через которые идут продажи: защита, обновления Bitrix и PHP, A/B-тесты, а задачи на улучшение предлагаем сами.

Задачи
Ждем от заказчика и предлагаем сами
Обновления
Да
  • Исправление ошибок на сайте
  • Небольшие доработки
  • Размещение контента
  • Учёт часов по каждой задаче
  • Ежемесячный отчёт о задачах
  • Резервная копия перед крупными правками
  • Мониторинг работоспособности сайта
  • Регулярное резервное копирование

Проверим ваш сайт бесплатно

Экспресс-аудит за 24 часа: скорость, индексация, мета-теги, коммерческие факторы и цели Метрики.