Bir web sayfası İç çerçeve içinde veya doğrudan tarayıcı penceresine yüklenebildiği olup olmadığını nasıl tanımlanır?

oy
450

Ben bir iframe tabanlı facebook app yazıyorum. Şimdi, normal bir web sitesi gibi facebook içinde tuval sayfayı oluşturmak için aynı html sayfası kullanmak istiyorum. Ben sayfa iframe içinde veya doğrudan tarayıcıda yüklü olup olmadığını belirlememiz bilmek istiyorum?

Oluştur 28/11/2008 saat 16:45
kaynak kullanıcı
Diğer dillerde...                            


15 cevaplar

oy
840

Tarayıcılar erişimi engelleyebilir window.topnedeniyle aynı kökenli politikası . IE hatalar da gerçekleşecek. İşte çalışma kod:

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

topve selfher ikisi de window(birlikte nesneler parent), bu nedenle pencere en üst pencere olup olmadığını görüyoruz.

Cevap 28/11/2008 saat 16:47
kaynak kullanıcı

oy
25

RoBorg doğrudur ama bir yan not eklemek istedim.

IE7 / IE8 Microsoft onlar eğer dikkatli değilseniz JS ile hasara neden olur bir şey kırdı onların tarayıcıya Sekmeler'i eklendiğinde.

Bu sayfa düzenini düşünün:

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

Şimdi çerçeve "baz" sen iyi çalışıyor ( "baz" çerçeve içinde hiçbir hedef, yükler) bir bağlantıyı tıklayın.

yüklenen sayfa, special.html diyoruz izin verirse, "o" adında bir üst çerçeve olup olmadığını kontrol etmek için JS kullandığı "bar" doğru dönecektir (beklenen).

Şimdi yükleyen special.html sayfası, varlığı ve onun adını üst çerçeve (denetler ve eğer "bar" Bu çubuk çerçeve içinde kendisini yeniden yükler olduğunu varsayalım. Örn

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

Çok uzak çok iyi. Şimdi hata geliyor.

yerine normal gibi orijinal linke tıklayarak ve "baz" çerçeve içinde special.html sayfa yükleme Diyelim, onu orta tıklandığında veya yeni Tab açmak için seçti.

Bu ne zaman yeni sekme yükler ( hiç hiçbir ebeveyn çerçeveli! ) IE sayfa yükleme sonsuz döngüye girer! çünkü yeni sekme bir ebeveyne sahip YAPAR ve bu ana adı "çubuk" HAS şekilde JavaScript çerçeve yapısı IE "üzerinde kopya".

İyi haber, bu denetimi geçerli:

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

Bu yeni sekmede return true etmez ve böylece bu garip durum için test edebilirsiniz.

Cevap 28/11/2008 saat 18:53
kaynak kullanıcı

oy
1

Eğer bir facebook uygulaması bağlamında soran olduğundan, ilk istek yapıldığında sunucuda bu tespit düşünebilirsiniz. Facebook kez bir iframe aranırsa fb_sig_user tuşu dahil olmak üzere verileri sorgu dizesi bir grup ileteceğiz.

muhtemelen kontrol edip uygulamanızda zaten bu verileri kullanmak gerektiğinden, işlemek için uygun bağlamı belirlemek için kullanabilirsiniz.

Cevap 11/12/2008 saat 23:04
kaynak kullanıcı

oy
2

Bunu gerçekleştirmek için nasıl bir örnek olarak bu javascript işlevi kullanın.

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;
}
Cevap 21/09/2011 saat 03:32
kaynak kullanıcı

oy
16

Kabul cevap Firefox 6.0 Extension (Eklenti-SDK 1.0) İçerik komut içinde benim için işe yaramadı: Firefox her içerik komut dosyası çalıştırır: üst düzey pencere ve tüm iframe'lerinde.

İçerik komut İçinde aşağıdaki sonuçları elde edersiniz:

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

Bu çıkışın ilgili garip şey, hep kod bir iframe veya üst düzey pencere içinde çalıştırılan bakmaksızın aynı olmasıdır.

Öte yandan Google Chrome yukarıda hiç işe yaramaz bu nedenle, üst düzey penceresi içinde sadece bir kez benim içerik komut dosyası çalıştırmak gibi görünüyor.

Ne nihayet iki tarayıcılarda bir içerik komut benim için çalıştı şudur:

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

Iframe'lerle olmadan bu baskılar 0:0, basıldıkça bir çerçeve ihtiva eden bir üst düzey penceresinde 1:1ve basan bir belgenin sadece iframe'de 0:1.

Bu, herhangi bir Iframe'ler mevcut olup olmadığını Uzantımın iki tarayıcılarda belirlemesine olanak sağlar ve ayrıca Firefox'ta o iframe'lerden birinin içine çalıştırılırsa.

Cevap 14/10/2011 saat 15:32
kaynak kullanıcı

oy
-1

Ben birkaç kez kullandım kod eski bir parça:

if (parent.location.href == self.location.href) {
    window.location.href = 'https://www.facebook.com/pagename?v=app_1357902468';
}
Cevap 25/10/2011 saat 04:57
kaynak kullanıcı

oy
5

Bunu kullanıyorum:

var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1);
Cevap 20/06/2012 saat 11:04
kaynak kullanıcı

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

Ama iç çerçevelerin sayısı, sayfa ve sayfa farklılık göstermesi halinde iframe'de sizi yüklüyoruz kim. Bu kodun sonucunun% 100 garanti olması sayfanıza hiçbir iframe yapın

Cevap 27/10/2012 saat 16:31
kaynak kullanıcı

oy
-4

her sayfada bu javascript yaz

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

Sonra otomatik ana sayfasına yönlendirir.

Cevap 08/02/2013 saat 07:15
kaynak kullanıcı

oy
0

Eğer kullanıcı İmzalı İsteği facebook sayfası sekmesini veya kanvas çek uygulamanızı erişiyor olmadığını bilmek istiyorum. bunu almak yoksa, muhtemelen kullanıcı facebook erişmekte değildir. Emin doğrulamaktadır signed_request alanları yapısını yapmak ve içerik alanları belirleyin.

php-sdk ile böyle İmzalı İsteği alabilirsiniz:

$signed_request = $facebook->getSignedRequest();

Burada İmzalı Request hakkında daha fazla bilgi edinebilirsiniz:

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

ve burada:

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

Cevap 17/06/2013 saat 19:08
kaynak kullanıcı

oy
64

window.frameElementeleman (örneğin, <iframe> veya <nesne>) pencere üst düzey ise pencere gömülü veya boş edildiği döner. Yani tanımlayıcı bir kod benziyor

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

Bu standarttır ve oldukça yeni bir yöntem. Tam olarak Chrome ve Firefox'ta çalışıyor. Ben evrensel bir çözüm olarak tavsiye edemez ama bence burada belirtilmesi gerekir.

Cevap 07/09/2013 saat 23:55
kaynak kullanıcı

oy
1

Aslında window.parent kontrol etmek için kullanılır ve bu benim için çalıştı, ama son zamanlarda pencere döngüsel nesnedir ve her zaman bir üst anahtarını iframe'den veya hiç iframe vardır.

yorum olarak sert window.parent eserlerle karşılaştırarak öneriyoruz. iframe ebeveyn olarak aynı web sayfası tam olarak bu çalışacaktır emin değilim.

window === window.parent;
Cevap 04/03/2014 saat 04:47
kaynak kullanıcı

oy
3

Bu örnek daha eski Web tarayıcılar için nasıl çalıştığını emin değilim ama IE, Firefox ve olmadan Chrome ve soruna yönelik bu kullanın:

var iFrameDetection = (window === window.parent) ? false : true;
Cevap 19/11/2015 saat 09:30
kaynak kullanıcı

oy
0

Best-for-şimdi Eski Tarayıcı Çerçeve Breaking Komut

Diğer çözümler benim için çalıştı olmadı. Bunun her tarayıcılarda çalışır:

Clickjacking karşı savunmak için bir yolu çerçeveli edilmemelidir her sayfasında bir "çerçeve kırıcı" senaryoyu eklemektir. Aşağıdaki metodoloji X-Frame-Options-Başlığını desteklemeyen hatta eski tarayıcılarda da suçlanan bir web sayfası, önleyecektir.

Belge BAŞ elemanı, aşağıdakileri ekleyin:

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

İlk biçim elemanının kendisi bir kimlik geçerlidir:

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

Bu şekilde, her şeyin belge HEAD olabilir ve yalnızca API bir yöntemi / taglib gerekir.

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

Cevap 12/04/2018 saat 09:24
kaynak kullanıcı

oy
0

Bu benim için basit çözüm olmaktan sona erdi.

    <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>
Cevap 25/07/2018 saat 01:15
kaynak kullanıcı

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