Defaults.Exposed

Defaults.ExposedВиправлення › Clickjacking protection (X-Frame-Options)

Як виправити Clickjacking protection (X-Frame-Options)

Однорядкова інструкція, що каже браузерам не дозволяти іншим сайтам таємно завантажувати ваш сайт всередині свого. Без неї шахрай може приховати ваші справжні, авторизовані сторінки за підробленою сторінкою і змусити ваших клієнтів натискати те, що вони ніколи не мали на увазі — підтверджувати платіж, змінювати пароль, надавати доступ.

Висновок для вашого бізнесу: Шахрай може невидимо обгорнути ваш живий сайт всередині підробленого і вкрасти гроші або доступ до облікових записів у авторизованих клієнтів — і для клієнта виглядає так, ніби це ваш сайт це зробив. Виправлення безкоштовне і займає у розробника близько 15 хвилин; залишення без нього — відома прогалина, яку як злочинці, так і обережні покупці можуть помітити за секунди.

Що це може вам коштувати

Чому це важливо. Це безкоштовне однорядкове налаштування, що займає хвилини для додавання, і воно закриває цілий клас обманів, спрямованих на ваших авторизованих клієнтів. В нашому оцінюванні це перевірка безпеки, що дає реальні бали, і оцінюється як висока серйозність, бо відсутній заголовок залишає відому, легко перевірювану дірку, яку злочинці автоматизують і на яку покупці звертають увагу.

Що це таке — простими словами

Коли хтось відвідує ваш сайт, їхній браузер також може бути вказаний завантажувати ваш сайт всередині іншого сайту — як маленьке вікно, вбудоване у більшу сторінку. Це звучить нешкідливо, і іноді це так. Але це механізм, що стоїть за атакою, що називається clickjacking.

Ось хитрість. Шахрай будує власну сторінку і тихо завантажує ваш справжній сайт всередині неї — невидимо, зробленим повністю прозорим. Потім вони накладають власний контент поверх: яскраву кнопку, «Відтворити відео», «Отримайте свій приз». Ваш клієнт бачить сторінку зловмисника і натискає те, що виглядає як нешкідлива кнопка. Але оскільки ваш справжній сайт сидить невидимо під їхнім курсором, натискання фактично потрапляє на вашу сторінку — підтверджуючи платіж, змінюючи пароль, схвалюючи доступ, приймаючи дозвіл. Клієнт думає, що натиснув одне; він насправді натиснув інше — на сайті, якому довіряє.

Захист від clickjacking — коротка, невидима інструкція, яку ваш сайт надсилає браузеру кожного відвідувача, що каже по суті:

«Не дозволяй іншим сайтам завантажувати мене всередині себе. Якщо хтось намагається, відмов».

Сучасні браузери автоматично підкоряються цьому. З увімкненим захистом хитрість просто не працює — вбудована копія вашого сайту відмовляється завантажуватись. Без нього ваш сайт може бути використаний як прихований шар у шахрайстві, і клієнт, якого обманули, асоціюватиме все це з вашим брендом, а не брендом зловмисника.

Що це може коштувати вам

Ось реалістичні, повсякденні сценарії.

  1. Невидиме «підтвердження». Клієнт авторизується на вашому порталі облікового запису в одній вкладці. Він потрапляє на сторінку (через рекламу, лист, результат пошуку), що обіцяє щось привабливе і показує велику кнопку «Продовжити». Прихована під цією кнопкою — ваша реальна кнопка «Підтвердити переказ» або «Змінити email», завантажена з їхньої власної авторизованої сесії. Вони натискають «Продовжити» — і мимоволі авторизують зміну у своєму фактичному обліковому записі у вас. Для них і для вашої команди підтримки виглядає так, ніби вони це зробили на вашому сайті.

  2. Захоплення налаштувань. Зловмисник оздоблює вашу сторінку налаштувань облікового запису і накладає нешкідливу гру або опитування. Кілька натискань у правильних місцях тихо перемикають налаштування — додаючи email зловмисника як адресу для відновлення, надаючи дозвіл застосунку або вимикаючи сповіщення безпеки. Обліковий запис тепер тихо скомпрометований.

  3. Угода, що зависла. Більший клієнт надсилає стандартний опитувальник безпеки перед підписанням. Одне запитання: чи встановлює ваш сайт захист від фреймування (X-Frame-Options / CSP frame-ancestors)? Ваш IT-контакт має відповісти «ні», і закупівлі призупиняються, поки ви поспіхом виправляєте безкоштовне 15-хвилинне налаштування, що тепер виглядає як тривожний сигнал.

  4. Кампанія з вашим брендом як наживкою. Оскільки ваші справжні, довірені сторінки можуть бути вбудовані, зловмисник використовує ваш логін або касу як переконливий шар у ширшій фішинговій кампанії. Клієнти, що потрапляють, не звинувачують таємничого зловмисника — вони пам’ятають це як час, коли «ваш сайт» дав їм бути обманутими.

  5. Позначка аудиту. Сканування страховика або аудитор, що перевіряє ваш стан безпеки, перераховує відсутній захист від clickjacking серед знахідок. Це підручна базова гігієна; наявність його позначеного сигналізує, що прості, безкоштовні засоби захисту не були на місці — що забарвлює те, як оцінюється решта вашої безпеки.

Що це насправді є

Коли браузер запитує сторінку вашого сайту, ваш сервер надсилає назад сторінку плюс кілька невидимих «заголовків» — додаткові інструкції, які браузер читає, але відвідувач ніколи не бачить. Захист від clickjacking доставляється через ці заголовки. Є два, і наша перевірка проходить, якщо присутній будь-який з них:

1. Старіший заголовок — X-Frame-Options:

X-Frame-Options: SAMEORIGIN

Це довготривалий, широко підтримуваний контроль. Він приймає одне з двох практичних значень:

2. Сучасний заголовок — Content-Security-Policy frame-ancestors:

Content-Security-Policy: frame-ancestors 'self';

Це новіший, гнучкіший контроль, на який вказують поточні стандарти. Він виконує ту ж роботу, але дозволяє бути точним щодо того, хто може вас вбудовувати:

Як виглядає «добре»

Найсильніше налаштування використовує обидва: frame-ancestors для сучасних браузерів (і для точності іменування дозволених вбудовувачів) і X-Frame-Options: SAMEORIGIN як запасний варіант для старіших клієнтів. Наша перевірка задоволена будь-яким із них сам по собі — але оскільки обидва безкоштовні і займають ті самі кілька хвилин, немає причини не встановлювати обидва.

Одна важлива деталь, яку повинен знати ваш розробник: заголовок Content-Security-Policy-Report-Only не застосовує нічого — він лише звітує. Якщо ви хочете, щоб захист від clickjacking дійсно набрав чинності, він повинен виходити від застосовуючого заголовка (звичайного Content-Security-Policy з frame-ancestors або X-Frame-Options), а не від заголовка лише звітування.

Як це виправити (безкоштовно, ~15 хвилин)

Передайте цей розділ тому, хто керує вашим сайтом — вашому IT-фахівцю, веб-розробнику або підтримці хостингу. Виправлення безкоштовне. Це один або два заголовки відповіді або правило у вашому CDN. Нічого купувати.

Перевірка проходить, коли присутній або заголовок X-Frame-Options (встановлений на DENY або SAMEORIGIN) або директива CSP frame-ancestors. Рекомендоване налаштування «пасок і підтяжки» додає обидва.

Крок 1 — Вирішіть, наскільки суворим бути

Крок 2 — Додайте заголовки (оберіть вашу платформу)

Nginx — всередині вашого блоку server:

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

Apache — переконайтеся, що mod_headers увімкнено, потім у вашому virtual host:

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

Microsoft IIS — у web.config всередині <customHeaders>:

<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Content-Security-Policy" value="frame-ancestors 'self';" />

Cloudflare (або подібний CDN): перейдіть до Rules → Transform Rules → Modify Response Header і додайте два правила, що встановлюють X-Frame-Options на SAMEORIGIN і Content-Security-Policy на frame-ancestors 'self'; для всіх відповідей. Це найлегший шлях, якщо у вас немає прямого доступу до сервера.

Вже надсилаєте Content-Security-Policy з інших причин? Не створюйте другого заголовку CSP — додайте frame-ancestors до вашої існуючої політики. Два заголовки CSP можуть конфліктувати.

Конструктори сайтів (Squarespace, Wix, Shopify тощо): ці платформи часто встановлюють захист від фреймування для вас, тому ви можете вже проходити без жодних дій. Якщо наша перевірка позначає, контроль зазвичай у налаштуваннях безпеки платформи, або ви додаєте його у CDN перед сайтом.

Крок 3 — Перезавантажте і перевірте

Перезавантажте веб-сервер або розгорніть правило CDN, потім завантажте ваш живий сайт і перевірте заголовки відповіді — засоби розробника браузера → вкладка Мережа → натисніть запит сторінки → Response Headers. Підтвердіть, що заголовок(и) з’являються на реальних відповідях сторінок, а не лише на головній сторінці. Потім повторно запустіть перевірку.

Поширені помилки

FAQ

Я не технічний фахівець — чи можу я впоратися з цим самостійно?

Вам не потрібно робити технічну частину. Це одне налаштування, що додається до сервера або CDN вашого сайту, і будь-який веб-розробник або IT-провайдер може додати це за кілька хвилин. Передайте їм розділ «Як це виправити» нижче — він точно каже їм, що додати. Виправлення безкоштовне; ми беремо плату лише якщо ви хочете, щоб ми продовжували моніторинг того, що воно залишається на місці.

Чи зупинить це мій власний сайт або законних партнерів від відображення моїх сторінок?

Лише якщо ви встановите занадто суворо. Загальне налаштування ('SAMEORIGIN' або 'frame-ancestors self') дозволяє вашому власному сайту нормально вбудовувати власні сторінки — воно блокує лише зовнішні сайти. Якщо справжній партнер повинен вбудовувати одну конкретну сторінку вашого сайту, ваш розробник може дозволити це одне джерело, все ще блокуючи всіх інших.

Ми малий бізнес — невже хтось справді буде нас атакувати?

Ці атаки виконуються масово автоматизованими інструментами, а не навмисно. Менші сайти часто атакують саме тому, що вони не мають базових захистів, як цей. Зловмиснику не потрібно знати, хто ви такі — йому просто потрібно, щоб ваш сайт можна було вбудовувати. Закриття прогалини нічого вам не коштує.

Як виглядає 'добре'?

Або заголовок X-Frame-Options зі значенням SAMEORIGIN (або DENY), або Content-Security-Policy з директивою frame-ancestors — ідеально обидва. Наша перевірка проходить, якщо присутній хоч один. Сучасний, більш гнучкий контроль — frame-ancestors; X-Frame-Options — старіший заголовок, що все ще охоплює деякі старі браузери, тому підхід «пасок і підтяжки» використовує обидва.

Хіба це не те саме, що SSL-замок або HTTPS?

Ні — вони захищають від абсолютно різних речей. HTTPS шифрує з'єднання, щоб ніхто не міг прочитати його в дорозі. Захист від clickjacking зупиняє завантаження ваших сторінок всередині чужого сайту взагалі. У вас може бути ідеальний замок і все одно бути широко відкритим до clickjacking. Вони окремі перевірки, і вам потрібні обидва.

Якщо ми не виправимо, це знижує нашу оцінку?

Так. Це оцінювана перевірка веб-безпеки, а не інформаційна — відсутній заголовок коштує балів і оцінюється як висока серйозність, бо він безпосередньо розкриває авторизованих клієнтів на шахрайство. Це також одні з найдешевших балів для відновлення: один безкоштовний заголовок, близько 15 хвилин роботи розробника.