Мы сталкивались с ситуацией, когда клиент потерял контроль над сайтом из-за Clickjacking: злоумышленник встроил форму авторизации в прозрачный iframe и перехватил учётные данные. После этого мы выработали надёжную методику защиты, которой делимся в этой статье. Наша команда с 5+ летним опытом в веб-безопасности настроит защиту от Clickjacking под ключ, гарантируя отсутствие уязвимостей. По статистике, до 15% атак на веб-формы связаны с этой техникой. Правильная конфигурация заголовков снижает риск на 99%.
Clickjacking — атака, при которой злоумышленник встраивает ваш сайт в прозрачный iframe поверх другой страницы. Пользователь думает, что кликает по кнопке стороннего ресурса, но на самом деле взаимодействует с вашим интерфейсом. Последствия: непреднамеренные переводы денег, изменение настроек, подтверждение действий. Защита строится на блокировке встраивания через HTTP-заголовки.
Как работает атака Clickjacking?
Злоумышленник создаёт страницу-ловушку с прозрачным iframe, в который загружает ваш сайт. Над iframe размещаются привлекательные элементы (кнопка «Получить приз»), и пользователь кликает по ним, не подозревая, что нажимает на скрытую кнопку вашего сайта. Типичные цели: подписка на услуги, перевод средств, смена пароля. Без защиты последствия могут быть катастрофическими.
X-Frame-Options: простая защита
Самый простой способ — заголовок X-Frame-Options. Он принимает два основных значения:
add_header X-Frame-Options "DENY" always; # или add_header X-Frame-Options "SAMEORIGIN" always; | Значение | Поведение | Совместимость |
|---|---|---|
DENY | Запрещает встраивание везде | Все современные браузеры |
SAMEORIGIN | Разрешает только с того же домена | Все современные браузеры |
ALLOW-FROM uri | Устарело, не поддерживается | Только старые версии IE |
Почему одного заголовка недостаточно?
X-Frame-Options не поддерживает гибкое разрешение для нескольких доверенных доменов. Для этого нужна директива frame-ancestors в Content-Security-Policy (CSP). Она современнее и даёт больше контроля. CSP frame-ancestors в 10 раз гибче, так как позволяет задавать несколько источников и регулярные выражения.
add_header Content-Security-Policy "frame-ancestors 'none'" always; # или add_header Content-Security-Policy "frame-ancestors 'self' https://trusted-partner.com" always; frame-ancestors 'none' — эквивалент DENY. Для максимальной совместимости с IE устанавливают оба заголовка.
| Аспект | X-Frame-Options | CSP frame-ancestors |
|---|---|---|
| Гибкость | Только одиночный источник | Множество доменов, регулярные выражения |
| Поддержка браузеров | Все, включая IE | Современные, IE10+ с CSP |
| Устаревание | Считается устаревшим | Актуальная спецификация |
Настройка в Apache
Header always set X-Frame-Options "SAMEORIGIN" Header always set Content-Security-Policy "frame-ancestors 'self'" Настройка в Laravel
// app/Http/Middleware/SecurityHeaders.php public function handle($request, Closure $next) { $response = $next($request); $response->header('X-Frame-Options', 'DENY'); $response->header('Content-Security-Policy', "frame-ancestors 'none'"); return $response; } Регистрируем middleware в Kernel.php и получаем глобальную защиту.
Исключения для виджетов
Если часть сайта намеренно встраивается (платёжная форма, виджет, embed-плеер), применяют гранулярную настройку через CSP на конкретных маршрутах, а не глобально. Например, в Laravel можно установить заголовки только для определённых URI.
Как мы обеспечиваем защиту от Clickjacking?
Наш процесс включает несколько этапов:
- Аудит текущей конфигурации — проверяем заголовки, ищем уязвимости.
- Проектирование политики — выбираем значения для X-Frame-Options и CSP с учётом бизнес-требований.
- Реализация — добавляем заголовки на всех серверах (Nginx, Apache, IIS) и в коде приложения.
- Тестирование — проверяем встраивание через iframe на разных браузерах, включая мобильные.
- Документация — фиксируем конфигурацию, передаём доступы и обучение вашей команде.
Мы выполнили более 50 проектов по настройке безопасности, гарантируя защиту от Clickjacking. Средняя экономия клиента от предотвращения атаки — до 100 000 рублей.
Что входит в работу
- Настройка заголовков на всех серверах (до 5 серверов включено).
- Интеграция в код на Laravel, Symfony, Yii и других фреймворках.
- Тестирование в браузерах: Chrome, Firefox, Safari, Edge, IE11.
- Аудит на предмет других уязвимостей (CSP, HSTS, X-Content-Type-Options).
- Отчёт с результатами и рекомендациями.
Типичные ошибки при настройке
- Использование только X-Frame-Options без CSP — не защищает от атак с множественными источниками.
- Установка
ALLOW-FROM— этот параметр не работает в современных браузерах, даёт ложное чувство безопасности. - Глобальный запрет iframe, когда нужна функциональность виджетов — решается гранулярными правилами.
Срок реализации: от 1 до 5 дней в зависимости от сложности инфраструктуры. Стоимость рассчитывается индивидуально — оценим проект после ознакомления с конфигурацией. MDN по X-Frame-Options рекомендует использовать оба заголовка для наилучшей совместимости. Свяжитесь с нами, чтобы получить консультацию и заказать настройку защиты от Clickjacking. Защитите свой сайт уже сегодня — предотвращение атаки стоит гораздо меньше, чем её последствия.







