IFRAME'in üst düzey pencereyi yeniden yönlendirmesi nasıl engellenir?


133

Bazı web sitelerinin kapsamları "kırmak" için kodu vardır IFRAME, yani bir sayfa bir üst sayfanın içinde Ayüklenirse, bazı Javascript in dış pencereyi yeniden yönlendireceği anlamına gelir .IFRAMEPAA

Genellikle bu Javascript şuna benzer:

<script type="text/javascript">
  if (top.location.href != self.location.href)
     top.location.href = self.location.href;
</script>

Sorum şu: Ana sayfanın Pyazarı olarak ve iç sayfanın yazarı olmamakla birlikte, bu patlamayı yapmamı Anasıl engelleyebilirim A?

Not: Bana siteler arası güvenlik ihlali gibi görünüyor, ama değil.


Çerçeve içeriğinin yazarı değilseniz ... pek bir şey yapabileceğinizi sanmıyorum.
scunliffe

Yanıtlar:


43

Kullanıcının sayfadan uzağa gitmek isteyip istemediğini seçmesine izin verecek onbeforeunload özelliğini kullanmayı deneyin.

Örnek: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

HTML5'te korumalı alan özelliğini kullanabilirsiniz. Lütfen aşağıdaki Pankrat'ın cevabına bakın. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/


1
iFrames yapmak kullanarak, olsa da, alanlar arası iletişime izin postMessage. Bu bir güvenlik riski değildir, ancak birisi yorumunuzu gördüğünde bu özelliğin var olduğunu bilmek isteyebilir. :)
coreyward

Bu cevabı yazarken mümkün değildi. Bu konuya işaret ettiğiniz için teşekkür ederiz.
fasih.rana

@ SirDarius, çok takdir edilen bir örnek gösterebilir misiniz?
user198989

Kullanıcı bu onayın neden göründüğünü bilmeyecek ve muhtemelen rastgele bir yanıt seçecektir. Kullanmanızı tavsiye etmiyorum. Başka çözümler de var - sandbox.
oriadam

1
@ fasih.rana İkinci makale bana çok yardımcı oldu. Teşekkür ederim;)
MrD

127

HTML5 ile iframe korumalı alan özelliği eklendi. Bu, yazılırken Chrome, Safari, Firefox ve IE ve Opera'nın son sürümlerinde çalışır, ancak hemen hemen istediğinizi yapar:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

Üst düzey yönlendirmelere izin vermek istiyorsanız belirtin sandbox="allow-top-navigation".


bir dakika ne? Bunu yapmana izin veriyorlar mı? Bir web sitesi açılmak isterse, tüm tarayıcıların izin vereceğini düşündüm. İnsanlar bununla birlikte web sitelerini iframe'lerin dışında nasıl tutabilirler? Yine de şikayet etmiyorum, harika.
Farzher


1
@StephenSarcsamKamenar Sitenizin iframe'de görüntülenmesini önlemek istiyorsanız , SAMEORIGIN değerine sahip X-Frame-Options başlığı vardır . Çoğu modern tarayıcı, siteyi bu başlığa sahip iframe'de görüntülemeyecektir.
Grzegorz

4
Maalesef sandboxkorumalı çerçevede Flash'a veya başka herhangi bir nesne türüne izin vermez ve bu sandboxözelliği çoğu durumda işe yaramaz hale getirir .
oriadam

1
Web siteleri, bir iframe'e dahil edilmeyi protesto etmek için "dağılmamalıdır". Sadece bir mesaj gösterebilir veya boş olabilirler. Ne yazık ki, komut dosyalarının iframe içinde çalışmasına izin vermek sizi yine de while (1) {} ve diğer sonsuz döngüleri yapan hileli bir iframe'e açar. Keşke her iframe kendi iş parçacığına sahip olabilseydi.
Gregory Magarshak

51

Sandbox = "..." kullanıyorum

  • allow-formları form göndermeye izin verir
  • allow-popups, pop-up'lara izin verir
  • allow-pointer-lock işaretçi kilidine izin verir
  • allow-same-origin, belgenin kaynağını korumasına izin verir
  • allow-scripts, JavaScript'in yürütülmesine izin verir ve ayrıca özelliklerin otomatik olarak tetiklenmesine izin verir
  • allow-top-navigation, üst düzey pencerede gezinerek belgenin çerçeveden çıkmasına izin verir

Üst gezinme, önlemek istediğiniz şeydir, bu nedenle bunu dışarıda bırakın ve buna izin verilmeyecektir. Dışarıda bırakılan her şey engellenecek

ex.

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

3
Flash'ın (ve diğer nesnelerin) de izin verme seçeneği olmaksızın engelleneceğini unutmayın. Bu "güvenlik özelliği"
korumalı


4

Sorunun yapılmasından bu yana uzun zaman geçtiğini biliyorum, ancak işte benim geliştirilmiş sürümüm, yalnızca iframe yüklendiğinde sonraki aramalar için 500ms bekleyecek.

<script type="text/javasript">
var prevent_bust = false ;
    var from_loading_204 = false;
    var frame_loading = false;
    var prevent_bust_timer = 0;
    var  primer = true;
    window.onbeforeunload = function(event) {
        prevent_bust = !from_loading_204 && frame_loading;
        if(from_loading_204)from_loading_204 = false;
        if(prevent_bust){
            prevent_bust_timer=500;
        }
    }
    function frameLoad(){
        if(!primer){
            from_loading_204 = true;
            window.top.location = '/?204';
            prevent_bust = false;
            frame_loading = true;
            prevent_bust_timer=1000;
        }else{
            primer = false;
        }
    }
    setInterval(function() {  
        if (prevent_bust_timer>0) {  
            if(prevent_bust){
                from_loading_204 = true;
                window.top.location = '/?204';
                prevent_bust = false;
            }else if(prevent_bust_timer == 1){
                frame_loading = false;
                prevent_bust = false;
                from_loading_204 = false;
                prevent_bust_timer == 0;
            }



        }
        prevent_bust_timer--;
        if(prevent_bust_timer==-100) {
            prevent_bust_timer = 0;
        }
    }, 1);
</script>

ve onload="frameLoad()"ve onreadystatechange="frameLoad();"çerçeve veya iç çerçeveye eklenmelidir.



2

İframe içine yüklediğiniz sayfa bir setInterval ile "break out" kodunu çalıştırabileceğinden, onbeforeunload o kadar pratik olmayabilir, çünkü kullanıcıyı 'Ayrılmak istediğinizden emin misiniz?' diyaloglar.

Ayrıca yalnızca IE ve Opera'da çalışan iframe güvenlik özelliği de vardır

:(


2

Benim durumumda kullanıcının iç sayfayı ziyaret etmesini istiyorum, böylece sunucu IP'lerini ziyaretçi olarak görsün. Eğer php proxy tekniğini kullanırsam, iç sayfanın sunucumu bir ziyaretçi olarak göreceğini ve bu yüzden iyi olmadığını düşünüyorum. Şimdiye kadar aldığım tek çözüm, yüklemeden önce Wilth. Bunu sayfanıza koyun:

<script type="text/javascript">
    window.onbeforeunload = function () {                       
         return "This will end your session";
    }
</script>

Bu hem firefox'ta hem de yani test ettiğim şeyde çalışıyor. Firefox'ta çalışmayan evt.return (her neyse) bok gibi bir şey kullanan sürümler bulacaksınız.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.