Hvordan finne ut om en nettside er lastet inne i en iframe, eller direkte i nettleservinduet?

stemmer
463

Jeg skriver en iframe basert facebook app. Nå ønsker jeg å bruke samme html side å gjengi vanlig nettside samt lerretet siden i facebook. Jeg vil vite om jeg kan finne ut om siden er lastet inne i iframe eller direkte i nettleseren?

Publisert på 28/11/2008 klokken 15:45
kilden bruker
På andre språk...                            


15 svar

stemmer
868

Nettlesere kan blokkere tilgang til window.topgrunnet samme opprinnelse politikk . IE bugs også finne sted. Her er arbeids kode:

function inIframe () {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

topog selfer begge windowstedene (sammen med parent), så du ser om vinduet er det øverste vinduet.

Svarte 28/11/2008 kl. 15:47
kilden bruker

stemmer
25

RoBorg er riktig, men jeg ønsket å legge til en side note.

I IE7 / IE8 når Microsoft lagt Tabs til nettleseren de brøt en ting som vil føre til kaos med JS hvis du ikke er forsiktig.

Tenk deg dette sideoppsettet:

MainPage.html
  IframedPage1.html   (named "foo")
  IframedPage2.html   (named "bar")
    IframedPage3.html (named "baz")

Nå i ramme "baz" du klikker på en link (ingen mål, masse i "Baz" ramme) det fungerer fint.

Hvis siden som blir lastet, kan kalle det special.html, bruker JS for å sjekke om "det" har en overordnede rammen som heter "bar" det vil returnere true (forventet).

Nå kan si at special.html siden når det lastes, kontrollerer den overordnede rammen (for eksistens og sitt navn, og hvis det er "bar" det laster seg selv i bar ramme. f.eks

if(window.parent && window.parent.name == 'bar'){
  window.parent.location = self.location;
}

Så langt så bra. Nå kommer den feilen.

Kan si i stedet for å klikke på den opprinnelige koblingen som vanlig, og lasting av special.html siden i "baz" ramme, du middel klikket det eller valgte å åpne den i en ny fane.

Når den nye fanen laster ( uten foreldre rammer i det hele tatt! ) IE vil gå inn en endeløs løkke av side lasting! fordi IE "kopier enn" rammestrukturen i Javascript slik at den nye kategorien har en forelder, og at foreldrene har navnet "bar".

Den gode nyheten er at kontroll:

if(self == top){
  //this returns true!
}

i den nye fanen ikke returnere true, og dermed kan du teste for dette merkelig tilstand.

Svarte 28/11/2008 kl. 17:53
kilden bruker

stemmer
1

Siden du spør i sammenheng med en facebook app, vil du kanskje vurdere å oppdage dette på serveren når den første forespørselen er gjort. Facebook vil passere langs en haug med QueryString data inkludert fb_sig_user nøkkelen hvis det kalles fra en iframe.

Siden du sannsynligvis trenger å kontrollere og bruke disse dataene likevel i programmet ditt, kan du bruke den til å bestemme den aktuelle konteksten å gjengi.

Svarte 11/12/2008 kl. 22:04
kilden bruker

stemmer
2

Bruk denne javascript funksjon som et eksempel på hvordan man skal oppnå dette.

function isNoIframeOrIframeInMyHost() {
// Validation: it must be loaded as the top page, or if it is loaded in an iframe 
// then it must be embedded in my own domain.
// Info: IF top.location.href is not accessible THEN it is embedded in an iframe 
// and the domains are different.
var myresult = true;
try {
    var tophref = top.location.href;
    var tophostname = top.location.hostname.toString();
    var myhref = location.href;
    if (tophref === myhref) {
        myresult = true;
    } else if (tophostname !== "www.yourdomain.com") {
        myresult = false;
    }
} catch (error) { 
  // error is a permission error that top.location.href is not accessible 
  // (which means parent domain <> iframe domain)!
    myresult = false;
}
return myresult;
}
Svarte 21/09/2011 kl. 02:32
kilden bruker

stemmer
16

Den aksepterte svaret fungerte ikke for meg inne i innholdsskript av en Firefox 6.0 Extension (Addon-SDK 1.0): Firefox utfører innholdsskript i hver: toppnivå vinduet og i alle iframes.

Inne i innholdsskript jeg får følgende resultater:

 (window !== window.top) : false 
 (window.self !== window.top) : true

Det merkelige ting om denne produksjonen er at det er alltid den samme uavhengig om koden kjøres inne i en iframe eller vindu på øverste nivå.

På den annen side Google Chrome ser ut til å kjøre min innholdsskript eneste gang i løpet av vindu på øverste nivå, slik at ovennevnte ikke ville fungere i det hele tatt.

Det som til slutt fungerte for meg i en innholdsskript i begge nettleserne er dette:

 console.log(window.frames.length + ':' + parent.frames.length);

Uten iframes Dette skriver 0:0, i et vindu på øverste nivå inneholdende en ramme det skrives 1:1, og i den eneste iframe av et dokument de skrives ut 0:1.

Dette gjør min forlengelse for å fastslå i begge nettleserne om det er noen iframes stede, og i tillegg i Firefox hvis den kjøres inn i en av iframes.

Svarte 14/10/2011 kl. 14:32
kilden bruker

stemmer
-1

Det er et gammelt stykke kode som jeg har brukt et par ganger:

if (parent.location.href == self.location.href) {
    window.location.href = 'https://www.facebook.com/pagename?v=app_1357902468';
}
Svarte 25/10/2011 kl. 03:57
kilden bruker

stemmer
5

Jeg bruker dette:

var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1);
Svarte 20/06/2012 kl. 10:04
kilden bruker

stemmer
-3
if (window.frames.length != parent.frames.length) { page loaded in iframe }

Men bare hvis antall iframes forskjellig i din side og side som legger du i iframe. Gjør ingen iframe på siden din å ha 100% garanti for resultatet av denne koden

Svarte 27/10/2012 kl. 15:31
kilden bruker

stemmer
-4

Skriv denne javascript i hver side

if (self == top)
  { window.location = "Home.aspx"; }

Deretter vil det automatisk omdirigerer til hjemmesiden.

Svarte 08/02/2013 kl. 06:15
kilden bruker

stemmer
0

Hvis du ønsker å vite om brukeren tilgang til app fra facebook side fane eller lerret sjekk for Signert Request. Hvis du ikke får det, sannsynligvis brukeren ikke har tilgang til fra facebook. For å være sikker bekrefte at signed_request felt struktur og felt innhold.

Med php-SDK kan du få den signert Request som dette:

$signed_request = $facebook->getSignedRequest();

Du kan lese mer om Signert Request her:

https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/

og her:

https://developers.facebook.com/docs/reference/login/signed-request/

Svarte 17/06/2013 kl. 18:08
kilden bruker

stemmer
66

window.frameElementReturnerer element (for eksempel <iframe> eller <object>) i hvilken vinduet er innleiret, eller null hvis vinduet er på øverste nivå. Så identifisere koden ser slik ut

if (window.frameElement) {
  // in frame
}
else {
  // not in frame
}

Dette er standard og ganske ny metode. Det fungerer akkurat i Chrome og Firefox. Jeg kan ikke anbefale det som universell løsning, men det bør nevnes her tror jeg.

Svarte 07/09/2013 kl. 22:55
kilden bruker

stemmer
1

Jeg faktisk brukes til å sjekke window.parent og det fungerte for meg, men i det siste vinduet er en syklisk objekt og har alltid en forelder nøkkel, iframe eller ingen iframe.

Som kommentarene foreslår vanskelig å sammenligne med window.parent fungerer. Ikke sikker på om dette vil fungere hvis iframe er nøyaktig den samme nettsiden som forelder.

window === window.parent;
Svarte 04/03/2014 kl. 03:47
kilden bruker

stemmer
3

Jeg er ikke sikker på hvordan dette eksempelet fungerer for eldre nettlesere, men jeg bruker dette for IE, Firefox og Chrome uten og problemet:

var iFrameDetection = (window === window.parent) ? false : true;
Svarte 19/11/2015 kl. 09:30
kilden bruker

stemmer
0

Best-for-nå eldre nett Frame Breaking Script

De andre løsningene ikke fungerte for meg. Denne fungerer på alle nettlesere:

En måte å forsvare seg mot Clickjacking er å inkludere en "frame-breaker" script på hver side som ikke bør rammes. Følgende metodikk vil hindre en nettside fra å bli rammet selv i eldre nettlesere, som ikke støtter X-Frame-Options-Header.

I dokumentet HEAD element, legge til følgende:

<style id="antiClickjack">body{display:none !important;}</style>

Først gjelder en ID for stilelementet selv:

<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

På denne måten kan alt være i dokumentet HEAD og du trenger bare en metode / taglib i API din.

Annonse: https://www.codemagi.com/blog/post/194

Svarte 12/04/2018 kl. 09:24
kilden bruker

stemmer
0

Dette endte være den enkleste løsningen for meg.

    <p id="demofsdfsdfs"></p>

<script>

if(window.self !== window.top) {

//run this code if in an iframe
document.getElementById("demofsdfsdfs").innerHTML = "in frame";

}else{

//run code if not in an iframe
document.getElementById("demofsdfsdfs").innerHTML = "no frame";
}

</script>
Svarte 25/07/2018 kl. 01:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more