Wiki · Вредоносные технологии
Кликджекинг
Кликджекинг (clickjacking, «угон клика») – это атака, при которой страницу вашего сайта загружают в невидимый фрейм на чужом сайте и подкладывают под безобидную кнопку. Человек думает, что нажимает «Получить приз», а на деле кликает по кнопке на вашем сайте.
Атака не взламывает сайт и не крадёт пароли. Она использует то, что посетитель уже вошёл в личный кабинет. Браузер честно открывает вашу страницу от его имени, а злоумышленник лишь подсовывает её под курсор. Поэтому защищаться приходится на стороне сайта: запретить показывать его страницы внутри чужих.
Как прозрачный фрейм перехватывает клик
На странице злоумышленника лежат два слоя. Сверху то, что видит человек: игра, опрос, кнопка «Скачать». Под ней фрейм с вашим сайтом, сделанный полностью прозрачным и сдвинутый так, чтобы нужная кнопка оказалась ровно под приманкой. Посетитель кликает по приманке, а клик получает ваша страница.

Если человек в этот момент авторизован на вашем сайте, действие выполнится с его правами. Сайт видит обычный клик настоящего пользователя и не может отличить его от честного. Так можно:
- Подтвердить действие в личном кабинете: подписку, смену настроек, удаление данных.
- Оформить заказ, если на сайте есть покупка в один клик.
- Нажать «Нравится» или «Подписаться» в соцсети. Эту разновидность называют лайкджекингом.
- Выполнить действие в админке CMS, если её открыл администратор.
Сильнее всего рискуют сайты с авторизацией и действиями в один клик: личные кабинеты, интернет-магазины, сервисы, админки. Для визитки без входа риск невелик, но защита настраивается за несколько минут, поэтому её ставят всем.
Заголовки, которые запрещают показ во фрейме
Основу защиты дают HTTP-заголовки: увидев их, браузер не покажет страницу во фрейме на чужом сайте.
| Заголовок | Значение | Что делает |
|---|---|---|
| X-Frame-Options | DENY | запрещает показ во фрейме везде |
| X-Frame-Options | SAMEORIGIN | разрешает фреймы только на вашем же сайте |
| Content-Security-Policy | frame-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-атак, а на вкладке исключений можно задать страницы, которые разрешено встраивать.

Заголовки стоит подкрепить настройками самого сайта:
- Cookies сессии с атрибутом SameSite=Lax или Strict браузер не отправляет во фрейм на чужом сайте, и пользователь там окажется не авторизован.
- Важные действия подтверждайте паролем или кодом: удаление аккаунта, смену почты, крупный заказ.
- Не делайте опасные действия в один клик без второго шага.
Когда фреймы всё-таки нужны
Полный запрет иногда ломает полезные вещи: виджет калькулятора на сайтах партнёров, встраивание формы на лендинг, предпросмотр страниц в сервисах аналитики. Яндекс Метрика прямо пишет: если сайт защищён от показа во фрейме заголовком X-Frame-Options, данные карт и Вебвизора будут недоступны для просмотра. В справке Метрики есть пример настройки nginx с исключением для её доменов. В таких случаях не отключайте защиту целиком, а разрешите встраивание только нужным доменам через frame-ancestors или исключения в Битриксе.
Почему запрет фреймов не срабатывает
- Указать X-Frame-Options со значением ALLOW-FROM. Современные браузеры его не поддерживают, для списка доменов нужен frame-ancestors.
- Прописать запрет в мета-теге страницы. Ни X-Frame-Options, ни frame-ancestors так не работают, их нужно отдавать заголовком ответа сервера.
- Защитить главную и забыть про личный кабинет и админку.
Как проверить защиту от фреймов на своём сайте
- Откройте любую страницу, во вкладке Network инструментов разработчика выберите документ и найдите в заголовках ответа X-Frame-Options и Content-Security-Policy.
- Проверьте несколько типов страниц: главную, карточку товара, личный кабинет, админку. Заголовки часто стоят не везде.
- После включения защиты убедитесь, что работают карты Метрики, виджеты и встроенные формы.

Заголовки безопасности мы проверяем и на техническом аудите сайта. Если доступа к конфигурации сервера нет, попросите поддержку хостинга добавить заголовки или включите защиту средствами 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.
Заголовки безопасности и защиту от кликджекинга настраиваем в услуге информационная безопасность сайтов. Проверить их вместе с остальными техническими настройками можно на техническом аудите сайта.
Документация и справки
- MDN Web Docs: X-Frame-Options, Content-Security-Policy frame-ancestors
- OWASP Cheat Sheet Series: Clickjacking Defense
- Документация 1С-Битрикс: модуль «Проактивная защита», раздел «Защита от фреймов»
- Справка Яндекс Метрики: карты и Вебвизор на сайтах с X-Frame-Options
См. также: Технический аудит сайта, Хостинг, CMS, Фреймы.
Остались вопросы по теме «Кликджекинг»?
Напишите нам в Telegram или MAX. Ответит специалист, который отвечает за эту тему, или руководитель проектов в рабочее время.
Отвечает по темеСтанислав БарановРуководитель направления безопасностиУслуги
Услуги по теме
Тарифы
Тарифы по теме
Пакет 20 часов в месяц для работающего сайта: следим за доступностью, делаем копии, восстанавливаем после сбоев и выкладываем контент.
- Задачи
- Ждем от заказчика
- Обновления
- Нет
- Исправление ошибок на сайте
- Небольшие доработки
- Размещение контента
- Учёт часов по каждой задаче
- Ежемесячный отчёт о задачах
- Резервная копия перед крупными правками
- Мониторинг работоспособности сайта
- Регулярное резервное копирование
Пакет 40 часов в месяц: сайт работает стабильно, а команда с дизайнером и разработчиками делает новые функции по вашим задачам.
- Задачи
- Ждем от заказчика
- Обновления
- Да
- Исправление ошибок на сайте
- Небольшие доработки
- Размещение контента
- Учёт часов по каждой задаче
- Ежемесячный отчёт о задачах
- Резервная копия перед крупными правками
- Мониторинг работоспособности сайта
- Регулярное резервное копирование
Пакет 80 часов в месяц для сайтов, через которые идут продажи: защита, обновления Bitrix и PHP, A/B-тесты, а задачи на улучшение предлагаем сами.
- Задачи
- Ждем от заказчика и предлагаем сами
- Обновления
- Да
- Исправление ошибок на сайте
- Небольшие доработки
- Размещение контента
- Учёт часов по каждой задаче
- Ежемесячный отчёт о задачах
- Резервная копия перед крупными правками
- Мониторинг работоспособности сайта
- Регулярное резервное копирование
Проверим ваш сайт бесплатно
Экспресс-аудит за 24 часа: скорость, индексация, мета-теги, коммерческие факторы и цели Метрики.
