Перейти к содержимому
>_ITDITDПлатформа веб-безопасности

Глоссарий

Что такое кликджекинг — невидимые ловушки, заставляющие нажимать скрытые кнопки

Кликджекинг накладывает настоящую страницу невидимо поверх сайта злоумышленника, чтобы вошедший пользователь нажимал «скрытые» кнопки. Как это работает и реальная защита (CSP frame-ancestors и X-Frame-Options, чтобы ваш сайт нельзя было поместить во фрейм) — объяснено с точки зрения защиты, без шагов атаки.

Опубликовано 2026-06-10 Обновлено 2026-06-10 3 мин чтения

«Кнопка, которую вы нажали намеренно, на самом деле оказалась кнопкой скрытой страницы под ней» — это и есть кликджекинг. Разберём, как он работает и как надёжно его предотвратить (без шагов атаки).

Что становится мишенью

Всё, что «один клик — готово, и ценно».

Вероятная мишеньПочему
Подтверждение перевода/покупкиОдин клик двигает деньги
Изменение настроек (видимость, подключённые приложения)Готовит позднейший захват или доступ к данным
OAuth / «Разрешить» на выдачу правМолча одобряет привязку аккаунта
Подписка / лайк / публикация в соцсетиЗлоупотребляют для распространения и накрутки лайков

Почему это работает

Браузеры могут загрузить другой сайт в iframe и наложить его сверху. Злоумышленник делает этот iframe прозрачным (opacity 0), поэтому пользователь видит только приманку, размещённую под ним. Когда пользователь нажимает «фальшивую кнопку», клик получает настоящая кнопка, лежащая прямо над ней.

Страница злоумышленника: «Вы выиграли приз — нажмите ниже!»
= прозрачный iframe настоящей страницы банка/настроек сверху
↓ пользователь нажимает видимую кнопку-приманку
на самом деле нажимается настоящая кнопка «Подтвердить» прямо над ней
↓ под собственным сеансом пользователя
перевод / изменение настроек / согласие выполняется как «действие пользователя»
Злоумышленник невидимо накладывает настоящий сайт; видна только приманка. Клик поглощает прозрачная настоящая кнопка.

Это похоже на CSRF, но CSRF отправляет запрос за кулисами, а кликджекинг заставляет пользователя управлять настоящим экраном — поэтому одни лишь CSRF-токены его не останавливают.

Защита: реальное решение — «нельзя поместить во фрейм»

1

Установите CSP frame-ancestors (самое важное)

Добавьте Content-Security-Policy: frame-ancestors 'self' (вас может фреймить только ваш собственный origin). Если вас никому не нужно встраивать, безопаснее всего 'none'. Перечисляйте домены только для партнёров, которым вы явно разрешаете.

2

Добавьте также X-Frame-Options (обратная совместимость)

Для старых клиентов отправляйте ещё и X-Frame-Options: DENY (или SAMEORIGIN). Двойная подстраховка для старых и новых браузеров.

3

Требуйте второй шаг для критических действий

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

4

Сделайте сеансовые куки SameSite

SameSite=Lax/Strict ограничивает межсайтовую автоотправку. Сам по себе это не полное решение от кликджекинга, но он ослабляет более широкий класс «действие началось с другого сайта».

Мнение этого сайта: одна строка заголовка решает больше всего — сперва проверьте свой сайт

Защита от кликджекинга — это не хитрый код; это одна-две строки заголовка ответа, убирающие основу, нужную для наложения. Применяйте их по всему сайту на уровне фреймворка или обратного прокси (Caddy/nginx), чтобы ничего не проскользнуло. Проверить, действительно ли frame-ancestors работает, можно проверщиком заголовков безопасности в инструментах этого сайта. «Думал, что настроил» — отсутствующий заголовок — это самая частая причина провала.

Читать дальше

FAQ

QЧто позволяет кликджекинг?
A

Клик, который пользователь делает «намеренно», попадает на кнопку настоящей страницы, лежащей под ним. Злоупотребляют критическими действиями в один клик: денежные переводы, изменения настроек, выдача разрешений, подписка/лайк в соцсети, кнопки согласия. Он не крадёт пароль — он заставляет уже вошедшего пользователя выполнить действие.

QКакая защита главная?
A

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

QДостаточно ли JavaScript-фреймбастинга?
A

Нет. У старых скриптов «вырвись, если я в iframe» много обходов, и они не помогают, когда JS отключён. Реальное решение — серверные заголовки (frame-ancestors / X-Frame-Options), которые говорят браузеру отказаться от встраивания.