Iframe Breaking: Kiel Ĉesigi Neaŭtorizitan Iframeton De Via Enhavo
Vizitanto de mia retejo iam informis min kiam li klakis sur unu el miaj ligiloj Twitter; li estis alportita al mia retejo kun granda ŝprucfenestro kaj malica koda averto. Tio sufiĉas por timigi iun, do mi komencis fari iujn provojn. Estis nenio malbona kun mia retejo - la problemo estis la ligo.
La ligilo en alia retejo produktis ilobreton supre, kiu instigis homojn alklaki malican ligilon dum ŝarĝo de mia retejo en iframe sube. Al plej multaj homoj, mia retejo povus ŝajni disvastigi malican kodon. Mi ne dirus, ke mi ŝatas ajnan retejon, kiu ŝarĝas mian retejon ene de iframe, do mi faris tion, kion farus iu racia geek... Mi ŝargis framrompilon.
Iframado de via retejo tamen ne ĉiam estas malica. Ni lastatempe dividis ilon, Sniply, por aldoni alvokon (CTA) al iu retejo, kiun vi dividas. Ĝi faras tion enigante vian tutan retejon en iframon kaj aplikante div super via enhavo kun la alvoko.
Sed mi estas sufiĉe aparta pri mia enhavo kaj la klopodo, kiun mi faris Martech Zone, do mi ne volas, ke iu ajn iframe mian enhavon, eĉ kun lig-kundivida platformo. Farante iujn esplorojn, ekzistas sufiĉe multaj manieroj trakti ĉi tion.
Kiel Ĉesi Iframi Vian Enhavon Per JavaScript
Ĉi tiu JavaScript-kodo kontrolas ĉu la nuna fenestro (self
) ne estas la plej supra fenestro (top
). Se ĝi ne estas, tio signifas, ke la paĝo estas en kadro, iframe aŭ simila, kaj la skripto redirektas la plej supran fenestron al la URL de la nuna fenestro. Ĉi efike eksplodas de la iframo.
<script type='text/javascript'>
if (top !== self) top.location.href = self.location.href;
</script>
Estas pluraj malavantaĝoj al ĉi tiu aliro:
- Fido je JavaScript: Se la uzanto havas JavaScript malŝaltita, ĉi tiu metodo ne funkcios.
- Prokrastoj: Povas ekzisti iometa prokrasto antaŭ la ekzekuto de JavaScript, dum kiu la enkadrigita versio de via retejo ankoraŭ povus esti videbla.
- Kruc-Originaj Limigoj: En iuj situacioj, la Sama Origina Politiko povas malhelpi ĉi tiun skripton funkcii kiel celite. Se la gepatra dokumento estas sur malsama domajno, ĝi eble ne povos aliri
top.location.href
. - Potencialo por Frame-Busting-Busters: Ekzistas ankaŭ skriptoj (nomitaj fram-rompaj-rompiloj) kiuj povas malhelpi skriptojn fram-rompantajn funkcii.
La pli bona aliro estas uzi HTTP-respondotitolojn.
X-Frame-Opcioj kaj Enhavo-Sekureco-Politiko
ambaŭ X-Frame-Options
kaj Content-Security-Policy
(CSP) estas HTTP-respondaj kaplinioj uzataj por plibonigi la sekurecon de retejo. Ili ĉiu servas iomete malsamajn celojn kaj havas malsamajn nivelojn de fleksebleco.
X-Frame-Options
estas pli malnova HTTP-kapo specife desegnita por kontroli ĉu via retejo povas esti enigita en a <frame>
, <iframe>
, <embed>
aŭ <object>
sur alia retejo. Ĝi havas tri eblajn direktivojn:
DENY
– La paĝo ne povas esti montrata en kadro, sendepende de la retejo provanta fari tion.SAMEORIGIN
– La paĝo povas esti montrata nur en kadro sur la sama origino kiel la paĝo mem.ALLOW-FROM uri
– La paĝo nur povas esti montrata en kadro sur la specifita origino.
tamen, X-Frame-Options
estas limigita pro tio ke ĝi ne povas pritrakti pli kompleksajn scenarojn, kiel permesi enkadrigi de pluraj malsamaj originoj aŭ uzi ĵokerojn por subdomajnoj. Ne ĉiuj retumiloj subtenas la ALLOW-FROM
direktivo.
Content-Security-Policy
, aliflanke, estas multe pli fleksebla kaj potenca HTTP-kapo. Dum ĝi povas fari ĉion X-Frame-Options
povas fari kaj multe pli, ĝia ĉefa celo estas malhelpi larĝan gamon de kodaj injektaj atakoj, inkluzive de transreta skribo (XSS) kaj clickjacking. Ĝi funkcias specifante blankan liston de fidindaj fontoj de enhavo (skriptoj, stiloj, bildoj, ktp.).
Por kontroli kadrojn, CSP uzas la frame-ancestors
direktivo. Vi povas specifi plurajn fontojn, inkluzive de pluraj domajnoj kaj ĵokeraj subdomajnoj. Jen ekzemplo:
cssCopy codeContent-Security-Policy: frame-ancestors 'self' yourdomain.com *.domain2.com;
Ĉi tio permesus al la paĝo esti enkadrigita sur sia propra retejo ('self'
), plu yourdomain.com
, kaj sur ajna subdomajno de domain2.com
.
CSP estas rekomendita kiel anstataŭaĵo por X-Frame-Options
, ĉar ĝi povas pritrakti ĉion X-Frame-Options
povas fari, kaj multe pli. Dum la plej multaj modernaj retumiloj subtenas CSP, eble ankoraŭ ekzistas kelkaj malnovaj aŭ malpli oftaj retumiloj kiuj ne plene subtenas ĝin.
Kiel Ĉesi Iframi Vian Enhavon Per HTML
Nun ekzistas meta-etikedo Enhavo-Sekureco-Politiko, kiu povas esti deplojita, kiu malŝaltas la kapablon iframe vian enhavon:
<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self' yourdomain.com">
La efikeco de la HTML meta-etikedo estas limigita ĉar ne ĉiuj retumiloj respektas la Content-Security-Policy
kiam oni agordas per meta-etikedo.
Kiel Ĉesi Iframi Vian Enhavon Per HTTP-Titoloj
Estas pli bone uzi la HTTP-kapojn X-Frame-Options
or Content-Security-Policy
por kontroli enkadrigo. Ĉi tiuj opcioj estas pli fidindaj, kaj sekuraj, kaj funkcias eĉ se JavaScript estas malŝaltita. La JavaScript-metodo devas esti uzata nur kiel lasta rimedo se vi ne havas kontrolon de la servilo por agordi HTTP-kapojn. Por ĉiu ekzemplo, anstataŭigu yourdomain.com
kun via reala domajno.
Apache – Modifi vian .htaccess
dosiero jene:
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self' yourdomain.com"
Nginx - Modifi vian servilan blokon jene:
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "frame-ancestors 'self' yourdomain.com";
IIS – faru tion aldonante la jenon al via web.config
dosiero:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self' yourdomain.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
WordPress – faru tion aldonante ĉi tiun kodon al via functions.php-dosiero:
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');
Ĉi tiuj agordoj nur permesos al via paĝo esti enigita ene de iframoj sur la ĝusta domajno, kiun vi specifas, ne sur iuj ajn domajnaj subdomajnoj. Se vi volas permesi iujn subdomajnojn, vi devos listigi ilin eksplicite, kiel subdomain1.yourdomain.com
subdomain2.yourdomain.com
, kaj tiel plu.
Permesu Iframi Vian Enhavon De Multoblaj Domajnoj
Vi povas specifi plurajn domajnojn per la responda kaplinio de Enhavo-Sekureco-Politiko HTTP kaj la direktivo de kadro-prapatroj. Spaco devas apartigi ĉiun domajnon. Jen ekzemplo:
Content-Security-Policy: frame-ancestors 'self' domain1.com domain2.com domain3.com;
Apache – Modifi vian .htaccess
dosiero jene:
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self' domain1.com domain2.com domain3.com"
Nginx - Modifi vian servilan blokon jene:
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "frame-ancestors 'self' domain1.com domain2.com domain3.com";
IIS – faru tion aldonante la jenon al via web.config
dosiero:
<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>
Permesu Iframi Vian Enhavon De Sovaĝa Domajno
Vi ankaŭ povas specifi ĵokeron por ĉiuj subdomajnoj kun la Content-Security-Policy
HTTP-responda kaplinio kaj la direktivo de kadro-prapatroj. Jen ekzemploj de la Content-Security-Policy
kodo, kiu devas esti ĝisdatigita:
Content-Security-Policy: frame-ancestors 'self' *.yourdomain.com;
Apache – Modifi vian .htaccess
dosiero jene:
Header always set Content-Security-Policy "frame-ancestors 'self' *.yourdomain.com"
Nginx - Modifi vian servilan blokon jene:
add_header Content-Security-Policy "frame-ancestors 'self' *.domain1.com *.domain2.com *.domain3.com";
IIS – faru tion aldonante la jenon al via web.config
dosiero:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self' *.yourdomain.com" />
</customHeaders>
</httpProtocol>
</system.webServer>