Defaults.Exposed › Rešenja › Zaštita od clickjackinga (X-Frame-Options)
Kako popraviti Zaštita od clickjackinga (X-Frame-Options)
Jednolinijska instrukcija koja govori pretraživačima da ne dozvole drugim sajtovima da tajno učitavaju vaš sajt unutar svog. Bez nje, prevarant može sakriti vaše prave, ulogovane stranice iza lažne stranice i prevariti vaše kupce da kliknu stvari koje nisu namjeravali — odobravajući plaćanje, mjenjajući lozinku, dajući pristup.
Suština za vaše poslovanje: Prevarant može nevidljivo omotati vaš pravi sajt unutar lažnog i ukrasti novac ili pristup nalogu od vaših ulogovanih kupaca — a kupcu izgleda kao da je vaš sajt to uradio. Popravka je besplatna i developeru traje oko 15 minuta; ostavljanje je neispravno poznata praznina koju kriminalci i pažljivi kupci mogu uočiti za sekunde.
Šta vam ovo može koštati
- Prevarant sakriva vaš pravi ekran za prijavu ili plaćanje iza nevidljive lažne stranice i prevari kupca da 'potvrdi' transfer ili promjenu postavki bez da shvati — kupac vas okrivljuje, ne napadača.
- Vaša ulogovana oblast naloga se nevidljivo učitava na vrhu stranice 'Pobijedili ste — kliknite za preuzimanje'; klik zapravo odobrava pravu promjenu na kupčevom nalogu, a vi primate ljutitu podršku.
- IT tim potencijalnog klijenta vrši brzo bezbednosno skeniranje pre potpisivanja, vidi da vaš sajt mogu embeddovati svi, i to flaguje kao rizik koji zaustavljava ili ubija posao.
- Vaš brend postaje mamac u kampanji prevare; kupci koji nasjednu pamte to kao 'kompanija čiji je sajt to dopustio'.
- Revizor ili cyber-osiguranje listom zaštita od clickjackinga kao greška osnovne higijene — jeftino popraviti, sramotno biti flagovan.
Zašto je to važno. Ovo je besplatna, jednolinijska postavka koja traje minuta za dodavanje, i zatvara cijelu klasu trikova usmjerenih na vaše ulogovane kupce. U našem bodovanju ovo je provjera web bezbednosti koja vrijedi prave bodove ocjenjena kao visoka ozbiljnost, jer nedostajući header ostavlja poznatu, lako-provjerenu rupu koju kriminalci automatiziraju i kupci traže.
Šta je ovo, jednostavnim rečima
Kad neko posjeti vaš sajt, pretraživaču se može reći da učita vaš sajt unutar drugog sajta — kao mali prozor embed-ovan unutar veće stranice. To zvuči bezazleno, i ponekad jeste. Ali to je mehanizam iza napada koji se zove clickjacking.
Evo trika. Prevarant gradi vlastitu stranicu i tiho učitava vaš pravi sajt unutar nje — nevidljivo, u potpunosti transparentno. Zatim iznad postavlja vlastiti sadržaj: sjajno dugme, “Play video”, “Preuzmite nagradu”. Vaš kupac vidi napadačevu stranicu i klikne na ono što izgleda kao bezazleno dugme. Ali jer je vaš pravi sajt nevidljivo ispod kursora, klik zaista pada na vaši stranici — potvrđujući plaćanje, mijenjajući lozinku, odobravajući pristup, prihvatajući dozvolu. Kupac misli da je kliknuo jednu stvar; zapravo su kliknuli drugu, na sajtu kojeg vjeruju.
Zaštita od clickjackinga je kratka, nevidljiva instrukcija koju vaš sajt šalje svim pretraživačima posjetioca koja u suštini kaže:
“Ne dozvoljavaj drugim sajtovima da me učitavaju unutar sebe. Ako neko pokuša, odbij.”
Moderni pretraživači to automatski poštuju. S tim uključenim, trik jednostavno ne funkcioniše — embed-ovana kopija vašeg sajta odbija učitati. Bez njega, vaš sajt je fer igra za korišćenje kao skriveni sloj u prevari, a kupac koji nasjedne će cijelu stvar asocirati s vašim brendom, ne napadačevim.
Šta vam ovo može koštati
Ovo su realistični, svakodnevni scenariji. Nikad ne navodimo pravo preduzeće; ovo su ilustracije kako se praznina koristi.
-
Nevidljivo “potvrdi”. Kupac je ulogovan na vaš portal naloga u jednom tabu. Dospijevaju na stranicu (iz oglasa, imejla, rezultata pretrage) koja obećava nešto primamljivo i prikazuje veliko dugme “Nastavite”. Skriveno ispod tog dugmeta je vaš pravi “Potvrdite transfer” ili “Promijenite imejl” kontroler, učitan iz njihove vlastite ulogovane sesije. Kliknu “Nastavite” — i nesvesno autorizuju promjenu na svom stvarnom nalogu kod vas. Njima, i vašem timu za podršku, izgleda kao da su to uradili na vašem sajtu.
-
Hijacking postavki. Napadač framuje stranicu vaših postavki naloga i na nju namece nevinu igru ili anketu. Nekoliko klikova na pravim mjestima tiho preokrine postavku — dodajući napadačev imejl kao adresu za oporavak, odobravajući pristup aplikaciji, ili onemogućavajući bezbednosno upozorenje. Nalog je sada tiho kompromitovan, i u to vreme ništa nije izgledalo pogrešno.
-
Posao koji zastaje. Veći kupac šalje standardni bezbednosni upitnik pre potpisivanja. Jedan red pita da li vaš sajt postavlja zaštitu od anti-framiranja (X-Frame-Options / CSP frame-ancestors). Vaš IT kontakt mora odgovoriti “ne,” i nabava pauzira dok žurite da popravite besplatno, 15-minutno podešavanje koje sada izgleda kao crvena zastava pred kupcem.
-
Brend kao mamac. Jer vaše prave, pouzdane stranice mogu biti embed-ovane, napadač koristi vaš login ili checkout kao uvjerljivi sloj u široj phishing kampanji. Kupci koji nasjednu ne okrivljuju sjenovitog napadača — pamte to kao vreme kad je “vaš sajt” dopustio da budu prevareni.
-
Oznaka revizije. Skeniranje osiguravača, ili revizor koji pregleda vašu bezbednosnu poziciju, navodi nedostajuću zaštitu od clickjackinga među nalazima. Ovo je standardna stavka osnovne higijene; njeno flagovanje signalizira da lake, besplatne zaštite nisu bile na snazi — što boji kako se ostatak vaše bezbednosti sudi.
Nit: šteta pada na pravog, ulogovanog kupca koji radi nešto što nije namjeravao — i nosi vaše ime, ne napadačevo.
Šta je to zapravo
Kad pretraživač traži stranicu od vašeg sajta, vaš server šalje nazad stranicu plus neke nevidljive “headere” — dodatne instrukcije koje pretraživač čita, ali posjetilac nikad ne vidi. Zaštita od clickjackinga isporučuje se putem ovih headera. Postoje dva, a naša provjera prolazi ako je ili jedan prisutan:
1. Stariji header — X-Frame-Options:
X-Frame-Options: SAMEORIGIN
Ovo je dugotrajna, široko podržana kontrola. Uzima jednu od dvije praktične vrijednosti:
SAMEORIGIN— vaš vlastiti sajt može embed-ovati vlastite stranice, ali nijedan spoljni sajt ne može. Siguran default za gotovo svakoga.DENY— niko ne smije embed-ovati vaše stranice, uključujući i vas. Koristite ovo samo ako vaš sajt nikad ne framuje vlastiti sadržaj.
2. Moderni header — Content-Security-Policy frame-ancestors:
Content-Security-Policy: frame-ancestors 'self';
Ovo je novija, fleksibilnija kontrola na koju trenutni standardi upućuju. Radi isti posao, ali vam dozvoljava da budete precizni o tome ko vas smije embed-ovati:
frame-ancestors 'self'— ekvivalentSAMEORIGIN.frame-ancestors 'none'— ekvivalentDENY.frame-ancestors 'self' https://partner.example.com— vaš vlastiti sajt plus jedan imenovan, poverljiv partner, i niko drugi.
Kako izgleda “dobro”
Najjača postavka koristi oboje: frame-ancestors za moderne pretraživače (i za preciznost imenovanja dozvoljenih embed-era) i X-Frame-Options: SAMEORIGIN kao fallback za starije klijente. Naša provjera je zadovoljna s ili jednim samim — ali budući da su oba besplatna i traju iste nekoliko minuta, nema razloga ne postaviti oba.
Jedan bitan detalj koji vaš developer treba znati: Content-Security-Policy-Report-Only header ne primjenjuje ništa — samo prijavljuje. Ako želite da zaštita od clickjackinga zapravo stupi na snagu, mora doći od primjenjenog headera (normalan Content-Security-Policy s frame-ancestors, ili X-Frame-Options), ne od report-only jednog.
Kako popraviti (besplatno, ~15 minuta)
Prosledite ovaj odeljak ko god pokreće vaš sajt — vašoj IT osobi, web developeru ili podršci hostinga. Popravka je besplatna. To su jedan ili dva response headera, ili pravilo u vašem CDN-u. Nema ničeg za kupiti.
Provjera prolazi kad je ili X-Frame-Options header (postavljen na DENY ili SAMEORIGIN) ili CSP frame-ancestors direktiva prisutna. Preporučena remen-i-tregeri postavka dodaje oba.
Korak 1 — Odlučite koliko strogi biti
- Većina preduzeća:
SAMEORIGIN/frame-ancestors 'self'. Vaš vlastiti sajt nastavlja raditi; spoljni su blokirani. - Ako vaš sajt nikad ne embed-uje vlastite stranice:
DENY/frame-ancestors 'none'za maksimalnu zaključanost. - Ako pravi partner mora embed-ovati specifičnu stranicu: imenujte ih eksplicitno s
frame-ancestors 'self' https://partner.example.com;i niko drugi ne ulazi.
Korak 2 — Dodajte headere (odaberite platformu)
Nginx — unutar vašeg server bloka:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;
Apache — osigurajte da je mod_headers omogućen, zatim u vašem virtual hostu:
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy "frame-ancestors 'self';"
Microsoft IIS — u web.config unutar <customHeaders>:
<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Content-Security-Policy" value="frame-ancestors 'self';" />
Cloudflare (ili sličan CDN): idite u Rules → Transform Rules → Modify Response Header i dodajte dva pravila koja postavljaju X-Frame-Options na SAMEORIGIN i Content-Security-Policy na frame-ancestors 'self'; za sve odgovore. Ovo je najlakši put ako nemate direktan pristup serveru.
Već šaljete Content-Security-Policy iz nekog razloga? Nemojte kreirati drugi CSP header — dodajte frame-ancestors u vašu postojeću politiku. Dva CSP headera mogu biti u konfliktu.
Graditelji sajtova (Squarespace, Wix, Shopify i slično): ove platforme često postavljaju anti-framing zaštitu za vas, pa možda već prolazite bez ikakvog rada. Ako naša provjera to flaguje, kontrola je obično u bezbednosnim podešavanjima platforme, ili je dodate u CDN ispred sajta.
Korak 3 — Reload i verifikujte
Reload-ujte web server ili deploy-ujte CDN pravilo, zatim učitajte vaš živi sajt i provjerite response headere — browser dev tools → Network tab → kliknite zahtjev stranice → Response Headers, ili koristite bilo koji besplatan alat za provjeru headera. Potvrdite da headeri(i) se pojavljuju na pravim odgovorima stranica, ne samo na početnoj. Zatim ponovo pokrenite provjeru.
Česte greške
- Korišćenje report-only CSP-a i pretpostavljanje da vas štiti.
Content-Security-Policy-Report-Onlysamo prijavljuje kršenja — ništa ne primjenjuje. Trebate primijenjeni header da zaštita stupi na snagu. - Postavljanje dva odvojena
Content-Security-Policyheadera. Ako već imate CSP, dodajteframe-ancestorsu njega umjesto emitiranja druge politike; suprotstavljeni CSP headeri mogu proizvesti neočekivano ponašanje. - Postavljanje
DENYkad vaš vlastiti sajt embed-uje vlastite stranice.DENYblokira sve framiranje, uključujući i vaše. Ako bilo koji dio vašeg sajta koristi iframes same sebe, koristiteSAMEORIGIN/frame-ancestors 'self'umjesto toga, ili ćete pokvariti vlastite stranice. - Zaštita samo početne stranice. Stranice koje su najbitnije za clickjacking su ulogovane — postavke naloga, potvrda plaćanja, admin. Pobrinite se da su headeri primijenjeni na cijeli sajt, ne samo na front page.
- Pretpostavljanje da HTTPS ili katanac već pokriva ovo. Enkripcija i anti-framing su nepovezani. Savršen sertifikat ništa ne radi da zaustavi embed-ovanje vaših stranica.
- Oslanjanje na stare workarounde. “Frame-busting” JavaScript (skripte koje pokušavaju probiti iz frame-ova) je nepouzdan i može biti zaobiđen. Headeri su ispravna, pretraživačem primjenjena popravka.
Često postavljana pitanja
Nisam tehničar — mogu li ovo srediti sam?
Ne trebate raditi tehnički dio. To je jedno podešavanje dodato u web server ili CDN vašeg sajta, a svaki web developer ili IT provajder to može dodati za nekoliko minuta. Prosledite im odeljak 'Kako popraviti' ispod — govori im tačno šta dodati. Popravka je besplatna; naplaćujemo jedino ako biste željeli da pratimo da ostane na snazi.
Hoće li ovo spriječiti moj vlastiti sajt, ili legitimne partnere, od prikazivanja mojih stranica?
Jedino ako ga postavite previše strogo. Uobičajeno podešavanje ('SAMEORIGIN', ili 'frame-ancestors self') i dalje dozvoljava vašem vlastitom sajtu da normalno embed-uje vlastite stranice — blokira samo spoljne sajtove. Ako pravi partner treba embed-ovati jednu specifičnu stranicu vašeg sajta, vaš developer može dozvoliti taj jedan izvor, a i dalje blokirati sve ostale.
Smo malo preduzeće — bi li neko zaista ciljao na nas?
Ovi napadi izvode se masovno automatizovanim alatima, ne ručno odabranim. Manji sajtovi su često pogođeni tačno zato što im nedostaju ovakve osnovne zaštite. Napadaču ne treba znati ko ste — samo je potrebno da vaš sajt bude embeddovati. Zatvaranje praznine ništa vam ne košta.
Kako zapravo izgleda 'dobro'?
Ili X-Frame-Options header postavljen na SAMEORIGIN (ili DENY), ili Content-Security-Policy s frame-ancestors direktivom — idealno oboje. Naša provjera prolazi ako je bilo koje od toga prisutno. Moderan, fleksibilniji kontroler je frame-ancestors; X-Frame-Options je stariji header koji i dalje pokriva neke legacy pretraživače, pa se remen-i-tregeri postavkom koriste oba.
Zar ovo nije isto što i SSL katanac ili HTTPS?
Ne — štite od potpuno različitih stvari. HTTPS šifrira vezu da je niko ne može čitati u tranzitu. Zaštita od clickjackinga sprečava da se vaše stranice uopšte učitavaju unutar nečijeg drugog sajta. Možete imati savršen katanac i i dalje biti potpuno otvoreni za clickjacking. To su odvojene provjere i trebate oboje.
Ako ne popravimo, snižava li nam ocjenu?
Da. Ovo je bodovana provjera web bezbednosti, ne informativna — nedostajući header košta bodove i ocjenjen je kao visoka ozbiljnost, jer direktno izlaže vaše ulogovane kupce prevari. Takođe je jedan od najjeftinijih bodova za povratiti: jedan besplatan header, oko 15 minuta developer-evog vremena.