Настройка защиты от Clickjacking (X-Frame-Options) на сайте
Clickjacking — атака, при которой злоумышленник встраивает ваш сайт в прозрачный iframe поверх другой страницы. Пользователь думает, что кликает по кнопке стороннего сайта, но на самом деле взаимодействует с вашим. Последствия: непреднамеренные переводы денег, изменение настроек, подтверждение действий.
Заголовок X-Frame-Options
Браузеру запрещается встраивать страницу в iframe:
add_header X-Frame-Options "DENY" always;
# или
add_header X-Frame-Options "SAMEORIGIN" always;
| Значение | Поведение |
|---|---|
DENY |
Запрещает встраивание везде |
SAMEORIGIN |
Разрешает только с того же домена |
ALLOW-FROM uri |
Устарело, не поддерживается современными браузерами |
CSP frame-ancestors — современная альтернатива
X-Frame-Options устарел, frame-ancestors в CSP даёт больше гибкости:
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' — эквивалент X-Frame-Options: DENY. Для максимальной совместимости устанавливают оба заголовка.
Настройка в 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;
}
Исключения для виджетов
Если часть сайта намеренно встраивается (платёжная форма, виджет, embed-плеер), применяют гранулярную настройку через CSP на конкретных маршрутах, а не глобально.
Срок реализации
Настройка заголовков — 1–2 часа включая тестирование во всех целевых браузерах.







