Iframe'i purunemine: kuidas peatada oma sisu volitamata iframe'i raamimine

Üks mu saidi külastaja andis mulle kord teada, kui klõpsas ühel minu lingil puperdama; ta toodi minu saidile suure hüpikakna ja pahatahtliku koodi hoiatusega. Sellest piisab, et kedagi hirmutada, nii et hakkasin katsetama. Minu saidil polnud viga – probleem oli lingis.
Teisel saidil olev link tekitas ülaosas tööriistariba, mis julgustas inimesi klõpsama pahatahtlikul lingil, laadides samal ajal minu saidi all olevasse iframe'i. Enamikule inimestest võib tunduda, et minu sait levitab pahatahtlikku koodi. Ma ei ütleks, et mulle meeldiks ükski sait, mis laadib mu saiti iframe'is, nii et ma tegin seda, mida iga mõistlik nohik teeks... Laadisin üles kaadrikaitse.
Teie saidi iframing ei ole siiski alati pahatahtlik. Hiljuti jagasime tööriista, Sniply, et lisada kutse tegevusele (CTA) mis tahes jagatud veebisaidi lingile. See teeb seda, manustades kogu teie saidi iframe'i ja rakendades tegevusele kutsega sisule div.
Kuid olen oma sisu ja tehtud jõupingutuste suhtes üsna konkreetne Martech Zone, nii et ma ei taha, et keegi mu sisu raamiks, isegi lingi jagamise platvormil. Mõne uurimistöö käigus on selle lahendamiseks üsna palju võimalusi.
Kuidas peatada oma sisu JavaScriptiga raamimine
See JavaScripti kood kontrollib, kas praegune aken (self) ei ole kõige ülemine aken (top). Kui see pole nii, tähendab see, et leht on raamis, iframe'is või muus sarnases ja skript suunab ülemise akna ümber URL praegusest aknast. Seda tõhusalt puhkeb iframe'ist.
<script type='text/javascript'>
if (top !== self) top.location.href = self.location.href;
</script> Sellel lähenemisviisil on mitmeid negatiivseid külgi:
- JavaScriptile tuginemine: kui kasutajal on JavaScript keelatud, siis see meetod ei tööta.
- Viivitused: JavaScripti käivitumiseni võib tekkida väike viivitus, mille jooksul võib teie saidi raamitud versioon siiski nähtav olla.
- Erineva päritoluga piirangud: Mõnes olukorras võivad samad päritolureeglid takistada selle skripti kavandatud töötamist. Kui ülemdokument asub teises domeenis, ei pruugi sellele pääseda juurde
top.location.href. - Potentsiaal kaadri katkestamiseks: on ka skripte (nimetatakse kaadri katkestavateks skriptideks), mis võivad takistada kaadri katkestavate skriptide töötamist.
Parem lähenemine on kasutada HTTP vastuse päiseid.
X-Frame-Options ja Content-Security-Policy
Mõlemad X-Frame-Options ja Content-Security-Policy (CSP) on HTTP vastuse päised, mida kasutatakse veebisaidi turvalisuse suurendamiseks. Igaüks neist teenib veidi erinevat eesmärki ja on erineva paindlikkuse tasemega.
X-Frame-Options on vanem HTTP-päis, mis on spetsiaalselt loodud kontrollima, kas teie saiti saab manustada a <frame>, <iframe>, <embed>või <object> teisel saidil. Sellel on kolm võimalikku direktiivi:
DENY– Lehte ei saa kuvada raami sees, olenemata sellest, kas sait seda üritab.SAMEORIGIN– Lehte saab kuvada ainult lehe enda päritoluga raamis.ALLOW-FROM uri– Lehte saab kuvada ainult määratud lähtekoha raamis.
Kuid X-Frame-Options on piiratud selle poolest, et see ei saa hakkama keerulisemate stsenaariumidega, nagu mitmest erinevast päritolust pärit raamimise lubamine või alamdomeenide metamärkide kasutamine. Kõik brauserid ei toeta seda ALLOW-FROM Direktiivi.
Content-Security-Policy, teisest küljest on palju paindlikum ja võimsam HTTP-päis. Kuigi see suudab kõike X-Frame-Options saab teha ja palju muud, selle esmane eesmärk on ennetada mitmesuguseid koodisüstimise rünnakuid, sealhulgas saidiüleseid skripte (XSS) ja klikkide äravõtmine. See toimib, määrates usaldusväärsete sisuallikate (skriptid, stiilid, pildid jne) valge nimekirja.
Kaadrite juhtimiseks kasutab CSP frame-ancestors direktiiv. Saate määrata mitu allikat, sealhulgas mitu domeeni ja metamärgiga alamdomeenid. Siin on näide:
cssCopy codeContent-Security-Policy: frame-ancestors 'self' yourdomain.com *.domain2.com;
See võimaldaks lehe raamida oma saidil ('self'), Edasi yourdomain.comja mis tahes alamdomeenil domain2.com.
CSP-d soovitatakse asendada X-Frame-Options, sest see saab kõigega hakkama X-Frame-Options saab teha ja palju muud. Kuigi enamik kaasaegseid brausereid toetab CSP-d, võivad siiski olla mõned vanad või vähem levinud brauserid, mis seda täielikult ei toeta.
Kuidas peatada oma sisu HTML-iga raamimine
Nüüd on olemas sisu-turvapoliitika metasilt, mida saab juurutada ja mis keelab teie sisu iframe'i loomise.
<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self' yourdomain.com">
HTML-i metasildi tõhusus on piiratud, kuna mitte kõik brauserid ei austa seda Content-Security-Policy metasilti kasutades.
Kuidas peatada oma sisu iframeerimine HTTP-päistega
Parem on kasutada HTTP päiseid X-Frame-Options or Content-Security-Policy raamimise juhtimiseks. Need valikud on töökindlamad ja turvalisemad ning töötavad isegi siis, kui JavaScript on keelatud. JavaScripti meetodit tuleks kasutada ainult viimase abinõuna, kui teil pole HTTP-päiste määramiseks serveri üle kontrolli. Iga näite puhul asendage yourdomain.com teie tegeliku domeeniga.
Apache – Muutke oma .htaccess fail järgmiselt:
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self' yourdomain.com"
nginx – Muutke oma serveriplokki järgmiselt.
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "frame-ancestors 'self' yourdomain.com";
IIS – tehke seda, lisades omale järgmised web.config faili:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self' yourdomain.com" />
</customHeaders>
</httpProtocol>
</system.webServer> WordPress – tehke seda, lisades selle koodi oma functions.php faili:
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'); Need konfiguratsioonid lubavad teie lehe manustada iframe'idesse ainult täpselt teie määratud domeenil, mitte ühelegi domeeni alamdomeenile. Kui soovite teatud alamdomeene lubada, peate need selgesõnaliselt loetlema, näiteks subdomain1.yourdomain.com subdomain2.yourdomain.com, ja nii edasi.
Lubage oma sisu ifraamimine mitmest domeenist
Saate määrata mitu domeeni Content-Security-Policy HTTP vastuse päise ja kaadri esivanemate direktiiviga. Iga domeeni peaks eraldama tühik. Siin on näide:
Content-Security-Policy: frame-ancestors 'self' domain1.com domain2.com domain3.com; Apache – Muutke oma .htaccess fail järgmiselt:
Header always set X-Frame-Options SAMEORIGINHeader always set Content-Security-Policy "frame-ancestors 'self' domain1.com domain2.com domain3.com" nginx – Muutke oma serveriplokki järgmiselt.
add_header X-Frame-Options SAMEORIGIN;add_header Content-Security-Policy "frame-ancestors 'self' domain1.com domain2.com domain3.com"; IIS – tehke seda, lisades omale järgmised web.config faili:
<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> Lubage oma sisu metamärgiga domeenilt ifraamida
Samuti saate määrata kõigi alamdomeenide jaoks metamärgi Content-Security-Policy HTTP vastuse päis ja kaadri esivanemate direktiiv. Siin on näited Content-Security-Policy kood, mis vajab värskendamist:
Content-Security-Policy: frame-ancestors 'self' *.yourdomain.com; Apache – Muutke oma .htaccess fail järgmiselt:
Header always set Content-Security-Policy "frame-ancestors 'self' *.yourdomain.com"
nginx – Muutke oma serveriplokki järgmiselt.
add_header Content-Security-Policy "frame-ancestors 'self' *.domain1.com *.domain2.com *.domain3.com"; IIS – tehke seda, lisades omale järgmised web.config faili:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self' *.yourdomain.com" />
</customHeaders>
</httpProtocol>
</system.webServer>