Razbijanje Iframea: Kako zaustaviti neovlašteno postavljanje u okvir vašeg sadržaja
Jednom me je posjetilac moje stranice obavijestio kada je kliknuo na jednu od mojih veza cvrkut; doveden je na moju stranicu s velikim iskačućim prozorom i upozorenjem o zlonamjernom kodu. To je dovoljno da nekoga uplašim, pa sam počeo da radim neke testove. Ništa nije bilo u redu sa mojom web lokacijom – problem je bio link.
Veza na drugoj stranici stvorila je alatnu traku na vrhu koja je ohrabrivala ljude da kliknu na zlonamjernu vezu dok učitavaju moju web stranicu u iframe ispod. Većini ljudi može izgledati da moja stranica širi zlonamjerni kod. Ne bih rekao da mi se sviđa bilo koja lokacija koja učitava moju stranicu unutar iframe-a, pa sam uradila ono što bi svaki razuman štreber uradio... Učitao sam razbijanje okvira.
Međutim, postavljanje u okvir vaše stranice nije uvijek zlonamjerno. Nedavno smo podijelili alat, Sniply, da dodate poziv na akciju (CTA) na bilo koju vezu na web stranicu koju dijelite. To radi tako što ugrađuje cijelu vašu web lokaciju u iframe i primjenjuje div na vaš sadržaj s pozivom na akciju.
Ali ja sam prilično konkretan u pogledu svog sadržaja i truda u koji sam uložio Martech Zone, tako da ne želim da bilo ko uokviruje moj sadržaj, čak ni sa platformom za dijeljenje linkova. Prilikom nekih istraživanja, postoji nekoliko načina da se ovo riješi.
Kako zaustaviti uokvirivanje vašeg sadržaja JavaScript-om
Ovaj JavaScript kod provjerava da li je trenutni prozor (self
) nije najviši prozor (top
). Ako nije, to znači da je stranica u okviru, iframe-u ili slično, a skripta preusmjerava najviši prozor na URL trenutnog prozora. Ovo efektivno izbije iframe-a.
<script type='text/javascript'>
if (top !== self) top.location.href = self.location.href;
</script>
Postoji nekoliko nedostataka ovog pristupa:
- Oslanjanje na JavaScript: Ako je korisniku onemogućen JavaScript, ova metoda neće raditi.
- Kašnjenja: Može doći do malog kašnjenja prije nego što se JavaScript izvrši, tokom kojeg bi uokvirena verzija vaše stranice i dalje mogla biti vidljiva.
- Ograničenja unakrsnog porijekla: U nekim situacijama, politika istog porijekla može spriječiti da ova skripta radi kako je predviđeno. Ako je nadređeni dokument na drugoj domeni, možda neće moći pristupiti
top.location.href
. - Potencijal za Frame-Busting-Busters: Postoje i skripte (zvane frame-busting-busters) koje mogu spriječiti rad skripti za razbijanje okvira.
Bolji pristup je korištenje HTTP zaglavlja odgovora.
X-Frame-Options i Content-Security-Policy
oba X-Frame-Options
i Content-Security-Policy
(SPRS) su HTTP zaglavlja odgovora koja se koriste za poboljšanje sigurnosti web stranice. Svaki od njih ima malo različite svrhe i imaju različite nivoe fleksibilnosti.
X-Frame-Options
je starije HTTP zaglavlje posebno dizajnirano za kontrolu da li se vaša stranica može ugraditi u a <frame>
, <iframe>
, <embed>
, ili <object>
na drugom sajtu. Ima tri moguće direktive:
DENY
– Stranica se ne može prikazati u okviru, bez obzira na to koja lokacija to pokušava.SAMEORIGIN
– Stranica se može prikazati samo u okviru na istom početku kao i sama stranica.ALLOW-FROM uri
– Stranica se može prikazati samo u okviru na navedenom početku.
Kako god, X-Frame-Options
je ograničen po tome što ne može da se nosi sa složenijim scenarijima, kao što je omogućavanje uokvirivanja iz više različitih izvora ili korišćenje zamenskih znakova za poddomene. Ne podržavaju svi pretraživači ALLOW-FROM
direktiva.
Content-Security-Policy
, s druge strane, je mnogo fleksibilnije i moćnije HTTP zaglavlje. Dok može sve X-Frame-Options
može učiniti i mnogo više, njegova primarna svrha je spriječiti širok spektar napada ubrizgavanjem koda, uključujući skriptiranje na više lokacija (XSS) i clickjacking. Radi tako što navede bijelu listu pouzdanih izvora sadržaja (skripte, stilovi, slike, itd.).
Za kontrolu okvira, CSP koristi frame-ancestors
direktiva. Možete navesti više izvora, uključujući više domena i poddomene sa zamjenskim znakovima. Evo primjera:
cssCopy codeContent-Security-Policy: frame-ancestors 'self' yourdomain.com *.domain2.com;
Ovo bi omogućilo da se stranica uokviri na vlastitu web lokaciju ('self'
), na yourdomain.com
, i na bilo kojoj poddomenu od domain2.com
.
CSP se preporučuje kao zamena za X-Frame-Options
, pošto može sve da podnese X-Frame-Options
mogu učiniti i još mnogo toga. Iako većina modernih pretraživača podržava CSP, možda još uvijek postoje neki stari ili manje uobičajeni pretraživači koji ga ne podržavaju u potpunosti.
Kako zaustaviti uokvirivanje vašeg sadržaja pomoću HTML-a
Sada postoji meta oznaka Content-Security-Policy koja se može primijeniti i koja onemogućuje mogućnost iframeiranja vašeg sadržaja:
<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self' yourdomain.com">
Efikasnost HTML meta oznake je ograničena jer ne poštuju svi pretraživači Content-Security-Policy
kada se postavi pomoću meta oznake.
Kako zaustaviti uokvirivanje vašeg sadržaja pomoću HTTP zaglavlja
Bolje je koristiti HTTP zaglavlja X-Frame-Options
or Content-Security-Policy
za kontrolu kadriranja. Ove opcije su pouzdanije i sigurnije i rade čak i ako je JavaScript onemogućen. JavaScript metod bi se trebao koristiti samo kao posljednje sredstvo ako nemate kontrolu nad serverom za postavljanje HTTP zaglavlja. Za svaki primjer zamijenite yourdomain.com
sa vašom stvarnom domenom.
apaš – Izmijenite svoj .htaccess
fajl kako slijedi:
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self' yourdomain.com"
Nginx – Modificirajte svoj blok servera na sljedeći način:
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "frame-ancestors 'self' yourdomain.com";
IIS – učinite to dodavanjem sljedećeg na svoj web.config
file:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self' yourdomain.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
WordPress – uradite ovo dodavanjem ovog koda u vašu functions.php datoteku:
function add_security_headers() {
header('X-Frame-Options: SAMEORIGIN');
header("Content-Security-Policy: frame-ancestors 'self' yourdomain.com");
}
add_action('send_headers', 'add_security_headers');
Ove konfiguracije će dozvoliti samo da vaša stranica bude ugrađena unutar iframe-ova na točno određenoj domeni koju navedete, a ne na bilo kojoj poddomenu domene. Ako želite dozvoliti određene poddomene, morat ćete ih eksplicitno navesti, npr subdomain1.yourdomain.com
subdomain2.yourdomain.com
, i tako dalje.
Dozvolite uokvirivanje vašeg sadržaja sa više domena
Možete navesti više domena sa zaglavljem HTTP odgovora Content-Security-Policy i direktivom frame-preci. Razmak bi trebao odvojiti svaku domenu. Evo primjera:
Content-Security-Policy: frame-ancestors 'self' domain1.com domain2.com domain3.com;
apaš – Izmijenite svoj .htaccess
fajl kako slijedi:
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self' domain1.com domain2.com domain3.com"
Nginx – Modificirajte svoj blok servera na sljedeći način:
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "frame-ancestors 'self' domain1.com domain2.com domain3.com";
IIS – učinite to dodavanjem sljedećeg na svoj web.config
file:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Content-Security-Policy" value="frame-ancestors 'self' domain1.com domain2.com domain3.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
Dozvolite uokvirivanje vašeg sadržaja sa zamjenske domene
Također možete odrediti zamjenski znak za sve poddomene sa Content-Security-Policy
HTTP zaglavlje odgovora i direktiva frame-preci. Evo primjera Content-Security-Policy
kod koji treba ažurirati:
Content-Security-Policy: frame-ancestors 'self' *.yourdomain.com;
apaš – Izmijenite svoj .htaccess
fajl kako slijedi:
Header always set Content-Security-Policy "frame-ancestors 'self' *.yourdomain.com"
Nginx – Modificirajte svoj blok servera na sljedeći način:
add_header Content-Security-Policy "frame-ancestors 'self' *.domain1.com *.domain2.com *.domain3.com";
IIS – učinite to dodavanjem sljedećeg na svoj web.config
file:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self' *.yourdomain.com" />
</customHeaders>
</httpProtocol>
</system.webServer>