Defaults.Exposed › Поправки › Защита срещу clickjacking (X-Frame-Options)
Как да поправите Защита срещу clickjacking (X-Frame-Options)
Еднолинейна инструкция, казваща на браузърите да не позволяват на други уебсайтове тайно да зареждат вашия сайт вътре в техния. Без нея измамник може да скрие вашите реални влезли страници зад фалшива страница и да подмами клиентите ви да кликват върху неща, за които не са целяли — одобряване на плащане, смяна на парола, предоставяне на достъп.
Заключение за вашия бизнес: Измамник може невидимо да обвие живия ви уебсайт вътре в фалшив и да открадне пари или достъп до акаунт от влезлите ви клиенти — и за клиента изглежда, че вашият сайт го е направил. Поправката е безплатна и отнема около 15 минути за разработчик; оставянето й изключена е известна пропаст, която и престъпниците, и внимателните купувачи могат да намерят за секунди.
Какво може да ви струва това
- Измамник скрива вашия реален екран за влизане или плащане зад безвредно изглеждаща страница и подмамва клиент да 'потвърди' превод или смяна на настройка, без да го осъзнава — клиентът обвинява вас, не нападателя.
- Влезлата зона за акаунт се зарежда невидимо върху страница 'Спечелихте — кликнете за получаване'; кликът всъщност одобрява реална промяна в акаунта на клиента при вас и вие получавате разгневения разговор за поддръжка.
- IT екипът на потенциален клиент прави бързо сканиране за сигурност преди подписване, вижда, че вашият сайт може да бъде вграден от всеки и го маркира като риск, спиращ или убиващ сделката.
- Вашата марка се превръща в стръвта в кампания за измама; клиентите, хванати в капан, го помнят като 'компанията, чийто сайт го е позволил.'
- Одитор или сканиране за киберзастраховка посочва липсващата защита срещу clickjacking като основна хигиенна грешка — евтина за поправяне, неудобна за маркиране.
Защо има значение. Това е безплатна, еднолинейна настройка, която отнема минути за добавяне и затваря цял клас трикове, насочени към влезлите ви клиенти. В нашата оценка тя е проверка за уеб сигурност, носеща реални точки, оценена с висока сериозност, защото липсваща заглавка оставя известна, лесно проверяема дупка, автоматизирана от престъпниците и търсена от купувачите.
Какво е това, с прости думи
Когато някой посещава вашия уебсайт, браузърът им може също да бъде казано да зарежда вашия сайт вътре в друг уебсайт — като малък прозорец, вграден в по-голяма страница. Звучи безвредно и понякога е така. Но именно механизмът стои зад атака, наречена clickjacking.
Ето трика. Измамник изгражда собствена страница и тихо зарежда вашия реален уебсайт вътре в нея — невидимо, направено напълно прозрачно. После слагат собственото си съдържание отгоре: флашлив бутон, „Пусни видеото”, „Вземи своята награда.” Вашият клиент вижда страницата на нападателя и кликва върху изглеждащия безвреден бутон. Но тъй като вашият реален сайт седи невидимо под курсора им, кликът всъщност пада на вашата страница — потвърждавайки плащане, сменяйки парола, одобрявайки достъп, приемайки разрешение. Клиентът смята, че е кликнал върху едно нещо; реално са кликнали върху друго, на сайт, на когото се доверяват.
Защитата срещу clickjacking е кратка, невидима инструкция, изпращана от вашия уебсайт до браузъра на всеки посетител, казваща в ефект:
„Не позволявай на другите уебсайтове да ме зареждат вътре в тях. Ако някой опита, откажи.”
Съвременните браузъри се подчиняват на това автоматично. С него включено, трикът просто не работи — вграденото копие на вашия сайт отказва да се зареди. Без него, вашият сайт е честна игра за употреба като скрития слой в измама, а клиентът, хванат в капан, ще асоциира цялото нещо с вашата марка, а не с тази на нападателя.
Какво може да ви струва това
Това са реалистични, ежедневни сценарии. Никога не назоваваме реален бизнес; това са илюстрации на начина, по който се използва пропастта.
-
Невидимото „потвърди”. Клиент е влезъл в портала ви за акаунт в един раздел. Попадат на страница (от реклама, имейл, резултат от търсене), обещаваща нещо примамливо и показваща голям бутон „Продължи.” Скрит под онзи бутон е вашият реален контрол „Потвърди превод” или „Смяна на имейл”, зареден от техния собствен влезъл сеанс. Те кликват „Продължи” — и несъзнателно разрешават промяна в реалния им акаунт при вас. За тях и за екипа ви за поддръжка изглежда като те са го направили на вашия сайт.
-
Хайджекването на настройките. Нападател вгражда страницата ви за настройки на акаунт и слага невинна игра или анкета отгоре. Няколко клика на правилните места тихо обръщат настройка — добавяйки имейла на нападателя като адрес за възстановяване, предоставяйки разрешение на приложение или деактивирайки сигнал за сигурност. Акаунтът вече е тихо компрометиран и нищо не е изглеждало грешно по онова време.
-
Сделката, която спира. По-голям клиент изпраща стандартния си въпросник за сигурност преди подписване. Един ред пита дали вашият сайт задава защита срещу вграждане (X-Frame-Options / CSP frame-ancestors). Вашият IT контакт трябва да отговори „не” и процедурата за закупуване прави пауза, докато се втурвате да поправите безплатна, 15-минутна настройка, изглеждаща вече като червен флаг пред купувача.
-
Кампанията марка-като-стръв. Тъй като вашите реални, доверени страници могат да бъдат вградени, нападателят използва вашето влизане или плащане като убедителния слой в по-широка фишинг кампания. Клиентите, хванати в капан, не обвиняват сенчестия нападател — помнят го като момента, в който „вашият сайт” ги е оставил да бъдат измамени.
-
Флагът от одит. Сканирането на застраховател или одитор, преглеждащ вашата позиция за сигурност, изброява липсващата защита срещу clickjacking сред находките. Това е учебниково основно хигиенно описание; наличието й маркирано сигнализира, че лесните, безплатни защити не са били на място — което оцветява начина, по който се преценява останалата ви сигурност.
Нишката: щетата пада върху реален, влезъл клиент, правещ нещо, което не е целял — и носи вашето ниме, а не на нападателя.
Какво всъщност е
Когато браузърът поиска страница от вашия уебсайт, сървърът изпраща обратно страницата плюс невидими „заглавки” — допълнителни инструкции, четени от браузъра, но невидими за посетителя. Защитата срещу clickjacking се доставя чрез тези заглавки. Има две и нашата проверка преминава ако е налице която и да е:
1. По-старата заглавка — X-Frame-Options:
X-Frame-Options: SAMEORIGIN
Това е дълго стандартният, широко поддържан контрол. Приема две практически стойности:
SAMEORIGIN— вашият собствен сайт може да вгражда собствените си страници, но никой външен сайт не може. Безопасното по подразбиране за почти всеки.DENY— никой не може да вгражда вашите страници, включително вие. Използвайте само ако вашият сайт никога не вгражда собственото си съдържание.
2. Съвременната заглавка — Content-Security-Policy frame-ancestors:
Content-Security-Policy: frame-ancestors 'self';
Това е по-новият, по-гъвкав контрол и този, към когото сочат текущите стандарти. Върши същата работа, но ви позволява да бъдете точни относно кой може да ви вгради:
frame-ancestors 'self'— еквивалентно наSAMEORIGIN.frame-ancestors 'none'— еквивалентно наDENY.frame-ancestors 'self' https://partner.example.com— вашият собствен сайт плюс един наименуван, доверен партньор и никой друг.
Как изглежда „добро”
Най-силната настройка използва и двете: 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 — Решете колко строги да бъдете
- Повечето бизнеси:
SAMEORIGIN/frame-ancestors 'self'. Вашият собствен сайт продължава да работи; аутсайдерите са блокирани. - Ако вашият сайт никога не вгражда собствените си страници:
DENY/frame-ancestors 'none'за максимална заключване. - Ако истински партньор трябва да вгради конкретна страница: именувайте ги изрично с
frame-ancestors 'self' https://partner.example.com;и никой друг не влиза.
Стъпка 2 — Добавете заглавките (изберете вашата платформа)
Nginx — вътре в блока server:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;
Apache — уверете се, че mod_headers е активиран, след това в своя виртуален хост:
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 пред сайта. (Забележка: Google Workspace и Microsoft 365 захранват имейла ви, а не вашия уебсайт — тази заглавка се задава там, където действително живее публичният ви сайт, а не в административната конзола на Workspace/365.)
Стъпка 3 — Презаредете и проверете
Презаредете уеб сървъра или разгърнете CDN правилото, след това заредете живия си сайт и проверете заглавките на отговора — инструменти за разработчик на браузъра → Раздел Мрежа → кликнете върху заявката за страница → Заглавки на отговора или всеки безплатен инструмент за проверка на заглавки. Потвърдете, че заглавките се появяват на реални отговори на страница, а не само на началната. После стартирайте отново проверката.
Чести грешки
- Използване на само-за-докладване CSP и предположение, че ви защитава.
Content-Security-Policy-Report-Onlyсамо докладва нарушения — не прилага нищо. Нуждаете се от приложена заглавка за ефективна защита. - Задаване на две отделни заглавки
Content-Security-Policy. Ако вече имате CSP, добаветеframe-ancestorsкъм нея, вместо да излъчвате втора политика; конфликтни CSP заглавки могат да произведат неочаквано поведение. - Задаване на
DENY, когато вашият собствен сайт вгражда собствените си страници.DENYблокира всяко вграждане, включително ваше. Ако каквато и да е part от сайта ви използва iframes на себе си, вместо това използвайтеSAMEORIGIN/frame-ancestors 'self', иначе ще счупите собствените си страници. - Защитавате само началната страница. Страниците, имащи най-голямо значение за clickjacking, са влезлите — настройки на акаунт, потвърждение на плащане, администратор. Уверете се, че заглавките са приложени в целия сайт, а не само на предната страница.
- Предположение, че HTTPS или катинарът вече обхваща това. Криптирането и защитата срещу вграждане не са свързани. Перфектен сертификат не прави нищо за спиране на вграждането на страниците ви.
- Разчитане на стари заобиколни решения. JavaScript „frame-busting” (скриптове, опитващи се да излязат от рамки) е ненадежден и може да бъде заобиколен. Заглавките са правилната, наложена от браузъра поправка.
ЧЗВ
Не съм технически — мога ли да се справя с това сам?
Не е нужно да правите техническата part. Тя е единична настройка, добавена към сървъра на вашия уебсайт или CDN, и всеки уеб разработчик или IT доставчик може да я добави за няколко минути. Предайте им раздела 'Как да го поправите' по-долу — казва им точно какво да добавят. Поправката е безплатна; ние таксуваме само ако искате да следим дали остава на място.
Ще спре ли това собствения ми сайт или легитимни партньори от показването на страниците ми?
Само ако го зададете твърде строго. Обичайната настройка ('SAMEORIGIN' или 'frame-ancestors self') все пак позволява на вашия собствен уебсайт да вгражда нормално собствените си страници — само блокира външни сайтове. Ако истински партньор трябва да вгради една конкретна ваша страница, вашият разработчик може да разреши точно онзи един източник, докато все още блокира всички останали.
Ние сме малък бизнес — наистина ли би ни насочил ли се ли някой?
Тези атаки се изпълняват масово от автоматизирани инструменти, а не се избират ръчно. По-малките сайтове често биват удряни именно защото им липсват основни защити като тази. Нападателят не трябва да знае кои сте — просто трябва вашият сайт да е вграждаем. Затварянето на пропастта не ви струва нищо.
Как изглежда реално 'добро'?
Или заглавка X-Frame-Options, зададена на SAMEORIGIN (или DENY), или CSP с директива frame-ancestors — в идеалния случай и двете. Нашата проверка преминава ако е налице което и да е. Съвременният, по-гъвкав контрол е frame-ancestors; X-Frame-Options е по-старата заглавка, все още обхващаща някои наследствени браузъри, така че двустранният ремък-и-скоби настройва и двете.
Това не ли е същото като SSL катинара или HTTPS?
Не — те защитават срещу напълно различни неща. HTTPS криптира връзката, за да не може никой да я чете в транзит. Защитата срещу clickjacking спира страниците ви да бъдат заредени вътре в нечий друг сайт изобщо. Можете да имате перфектен катинар и все пак да сте напълно отворени за clickjacking. Те са отделни проверки и искате и двете.
Ако не го поправим, понижава ли оценката ни?
Да. Това е оценена проверка за уеб сигурност, а не информационна — липсваща заглавка струва точки и е оценена с висока сериозност, тъй като директно излага влезлите ви клиенти на измама. Това е и едно от най-евтините точки за възстановяване: единична безплатна заглавка, около 15 минути от времето на разработчик.