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?
Bir web sayfası İç çerçeve içinde veya doğrudan tarayıcı penceresine yüklenebildiği olup olmadığını nasıl tanımlanır?
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.
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.
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.
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;
}
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.
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';
}
Bunu kullanıyorum:
var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1);
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
her sayfada bu javascript yaz
if (self == top)
{ window.location = "Home.aspx"; }
Sonra otomatik ana sayfasına yönlendirir.
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/
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.
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;
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;
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
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>













