Iframe feltörés: Hogyan állítsuk le a tartalmainak jogosulatlan iframe-ezését
A webhelyem egyik látogatója egyszer értesített, amikor rákattintott az egyik linkemre Twitter; egy nagy felugró ablakkal és egy rosszindulatú kódra figyelmeztető üzenettel került az oldalamra. Ez elég ahhoz, hogy valakit a fenébe ijesztsek, ezért elkezdtem tesztelni. Nem volt semmi baj az oldalammal – a probléma a link volt.
A másik webhelyen található hivatkozás egy eszköztárat hozott létre a tetején, amely arra ösztönözte az embereket, hogy egy rosszindulatú hivatkozásra kattintsanak, miközben betöltik a webhelyemet az alatta lévő iframe-be. A legtöbb ember számára úgy tűnhet, hogy a webhelyem rosszindulatú kódot terjeszt. Nem mondanám, hogy szeretek olyan webhelyeket, amelyek egy iframe-en belül töltik be a webhelyemet, ezért azt tettem, amit minden ésszerű stréber tenne… Feltöltöttem egy keretmegszakítót.
A webhely iframe-be állítása azonban nem mindig rosszindulatú. Nemrég megosztottunk egy eszközt, Sniply, cselekvésre ösztönzés hozzáadásához (CTA) bármely megosztott webhelylinkre. Ezt úgy éri el, hogy a teljes webhelyet beágyazza egy iframe-be, és a cselekvésre ösztönzéssel divet alkalmaz a tartalomra.
De nagyon különös vagyok a tartalmam és az általam tett erőfeszítések tekintetében Martech Zone, így nem szeretném, ha bárki iframe-elné a tartalmamat, még link-share platformmal sem. Némi kutatás során jó néhány módszer létezik ennek kezelésére.
Hogyan állítsuk le a tartalom iframezését JavaScripttel
Ez a JavaScript kód ellenőrzi, hogy az aktuális ablak (self
) nem a legfelső ablak (top
). Ha nem, ez azt jelenti, hogy az oldal keretben, iframe-ben vagy hasonlóban van, és a szkript átirányítja a legfelső ablakot a URL az aktuális ablakból. Ezt hatékonyan kitör az iframe-ből.
<script type='text/javascript'>
if (top !== self) top.location.href = self.location.href;
</script>
Ennek a megközelítésnek számos hátránya van:
- JavaScriptre támaszkodás: Ha a felhasználónál le van tiltva a JavaScript, ez a módszer nem fog működni.
- késések: Előfordulhat egy kis késés a JavaScript végrehajtása előtt, amely alatt webhelyének keretes verziója továbbra is látható lehet.
- Cross-eredet korlátozások: Egyes helyzetekben ugyanaz a származási szabályzat megakadályozhatja, hogy ez a szkript a kívánt módon működjön. Ha a szülődokumentum egy másik tartományban található, előfordulhat, hogy nem tud hozzáférni
top.location.href
. - Lehetőség a keret-elszakadásra: Vannak olyan szkriptek is (úgynevezett frame-busting-busters), amelyek megakadályozhatják a frame-busting szkriptek működését.
A jobb megközelítés a HTTP válaszfejlécek használata.
X-Frame-Options és Content-Security-Policy
Mindkét X-Frame-Options
és a Content-Security-Policy
(CSP) HTTP-válaszfejlécek, amelyek a webhelyek biztonságának fokozására szolgálnak. Mindegyikük kissé eltérő célokat szolgál, és eltérő szintű rugalmassággal rendelkeznek.
X-Frame-Options
egy régebbi HTTP-fejléc, amelyet kifejezetten arra terveztek, hogy szabályozza, hogy webhelye beágyazható-e a <frame>
, <iframe>
, <embed>
vagy <object>
egy másik oldalon. Három lehetséges irányelve van:
DENY
– Az oldal nem jeleníthető meg keretben, függetlenül attól, hogy az oldal megpróbálja ezt megtenni.SAMEORIGIN
– Az oldal csak olyan keretben jeleníthető meg, amely ugyanazon az eredeten van, mint maga az oldal.ALLOW-FROM uri
– Az oldal csak keretben jeleníthető meg a megadott eredeten.
Azonban, X-Frame-Options
korlátozott abban az értelemben, hogy nem tud bonyolultabb forgatókönyveket kezelni, például több különböző forrásból származó keretezés engedélyezését vagy helyettesítő karakterek használatát az aldomaineknél. Nem minden böngésző támogatja a ALLOW-FROM
Irányelv.
Content-Security-Policy
, másrészt egy sokkal rugalmasabb és erősebb HTTP-fejléc. Miközben mindenre képes X-Frame-Options
és még sok minden mást is megtehet, elsődleges célja a kódbefecskendezési támadások széles körének megakadályozása, beleértve a webhelyek közötti parancsfájlokat (XSS) és a clickjacking. Úgy működik, hogy megadja a megbízható tartalomforrások (szkriptek, stílusok, képek stb.) engedélyezési listáját.
A keretek vezérléséhez a CSP a frame-ancestors
irányelv. Több forrást is megadhat, köztük több tartományt és helyettesítő karakteres aldomaint. Íme egy példa:
cssCopy codeContent-Security-Policy: frame-ancestors 'self' yourdomain.com *.domain2.com;
Ez lehetővé tenné, hogy az oldal a saját webhelyén kerüljön keretbe ('self'
), tovább yourdomain.com
, és a domain bármely aldomainjén domain2.com
.
A CSP helyett javasolt X-Frame-Options
, hiszen mindent elbír X-Frame-Options
megteheti, és még sok más. Bár a legtöbb modern böngésző támogatja a CSP-t, előfordulhat, hogy még mindig vannak régi vagy kevésbé elterjedt böngészők, amelyek nem támogatják teljes mértékben.
Hogyan állítsuk le a tartalom iframezését HTML-lel
Mostantól van egy Content-Security-Policy metacímke, amely telepíthető, és letiltja a tartalom iframe-elésének lehetőségét:
<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self' yourdomain.com">
A HTML metacímke hatékonysága korlátozott, mert nem minden böngésző tartja tiszteletben a Content-Security-Policy
metatag használatával beállítva.
Hogyan állítsuk le a tartalom iframezését HTTP-fejlécekkel
Jobb a HTTP fejlécek használata X-Frame-Options
or Content-Security-Policy
a keretezés szabályozására. Ezek a beállítások megbízhatóbbak és biztonságosabbak, és akkor is működnek, ha a JavaScript le van tiltva. A JavaScript-módszert csak végső megoldásként szabad használni, ha nem rendelkezik a kiszolgáló felett a HTTP-fejlécek beállításával. Mindegyik példánál cserélje ki yourdomain.com
a tényleges domainnel.
Apache – Módosítsa a sajátját .htaccess
fájl az alábbiak szerint:
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self' yourdomain.com"
nginx – Módosítsa a szerverblokkot az alábbiak szerint:
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "frame-ancestors 'self' yourdomain.com";
IIS – ezt úgy teheti meg, hogy hozzáadja a következőt a sajátjához web.config
file:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self' yourdomain.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
WordPress – ehhez adja hozzá ezt a kódot a functions.php fájlhoz:
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');
Ezek a konfigurációk csak az Ön által megadott pontos domain iframe keretébe ágyazzák be az oldalt, nem pedig a domain aldomainjeibe. Ha engedélyezni szeretne bizonyos aldomaineket, kifejezetten fel kell sorolnia azokat, például subdomain1.yourdomain.com
subdomain2.yourdomain.com
, És így tovább.
Engedélyezze a tartalom iframe-be helyezését több domainről
Több tartományt is megadhat a Content-Security-Policy HTTP válaszfejléccel és a frame-ancestors direktívával. Minden tartományt szóközzel kell elválasztani. Íme egy példa:
Content-Security-Policy: frame-ancestors 'self' domain1.com domain2.com domain3.com;
Apache – Módosítsa a sajátját .htaccess
fájl az alábbiak szerint:
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self' domain1.com domain2.com domain3.com"
nginx – Módosítsa a szerverblokkot az alábbiak szerint:
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "frame-ancestors 'self' domain1.com domain2.com domain3.com";
IIS – ezt úgy teheti meg, hogy hozzáadja a következőt a sajátjához 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>
Engedélyezze a tartalom iframezését helyettesítő karakteres domainről
Az összes aldomainhez helyettesítő karaktert is megadhat a Content-Security-Policy
HTTP válaszfejléc és a keret-elődök direktíva. Íme példák a Content-Security-Policy
frissítésre szoruló kód:
Content-Security-Policy: frame-ancestors 'self' *.yourdomain.com;
Apache – Módosítsa a sajátját .htaccess
fájl az alábbiak szerint:
Header always set Content-Security-Policy "frame-ancestors 'self' *.yourdomain.com"
nginx – Módosítsa a szerverblokkot az alábbiak szerint:
add_header Content-Security-Policy "frame-ancestors 'self' *.domain1.com *.domain2.com *.domain3.com";
IIS – ezt úgy teheti meg, hogy hozzáadja a következőt a sajátjához web.config
file:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self' *.yourdomain.com" />
</customHeaders>
</httpProtocol>
</system.webServer>