Bagaimana mencegah IFRAME mengarahkan ulang jendela tingkat atas

133

Beberapa situs web memiliki kode untuk "keluar" dari IFRAMElampiran, yang berarti bahwa jika halaman Adimuat sebagai bagian IFRAMEdalam halaman induk, Pbeberapa Javascript di akan Amengarahkan ulang jendela luar ke A.

Biasanya Javascript ini terlihat seperti ini:

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

Pertanyaan saya adalah: Sebagai penulis halaman induk Pdan bukan penulis halaman dalam A, bagaimana saya bisa mencegah Adari melakukan break-out ini?

PS Bagi saya sepertinya itu seharusnya merupakan pelanggaran keamanan lintas-situs, tetapi tidak.

Jason Cohen
sumber
Saya tidak berpikir Anda dapat melakukan banyak hal sama sekali ... jika Anda bukan penulis konten bingkai.
scunliffe

Jawaban:

43

Coba gunakan properti onbeforeunload, yang akan memungkinkan pengguna memilih apakah dia ingin bernavigasi menjauh dari halaman.

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

Di HTML5 Anda dapat menggunakan properti kotak pasir. Silakan lihat jawaban Pankrat di bawah ini. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

fasih.rana
sumber
1
Iframe lakukan memungkinkan komunikasi lintas-domain, meskipun, menggunakan postMessage. Ini bukan risiko keamanan, tetapi seseorang mungkin ingin tahu bahwa kemampuan ini ada ketika mereka melihat komentar Anda. :)
coreyward
Itu tidak mungkin pada saat penulisan jawaban ini. terimakasih telah menunjukkan itu.
fasih.rana
@ SirDarius bisa tolong tunjukkan contoh, sangat dihargai.
user198989
Pengguna tidak akan tahu mengapa konfirmasi ini muncul, dan mungkin akan memilih respons acak. Saya tidak merekomendasikan menggunakannya. Ada solusi lain- itu sandbox.
oriadam
1
@ fasih.rana Artikel kedua sangat membantu saya. Terima kasih;)
MrD
127

Dengan HTML5, atribut sandbox iframe telah ditambahkan. Pada saat penulisan ini berfungsi pada Chrome, Safari, Firefox, dan versi terbaru dari IE dan Opera tetapi cukup banyak melakukan apa yang Anda inginkan:

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

Jika Anda ingin mengizinkan pengalihan tingkat atas, tentukan sandbox="allow-top-navigation".

Pankrat
sumber
tunggu apa? Mereka membiarkan Anda melakukan ini? Saya pikir jika situs web ingin keluar, semua browser akan membiarkannya. Bagaimana orang-orang seharusnya menjaga situs web mereka dari iframe dengan ini? Saya tidak mengeluh, luar biasa.
Farzher
3
Berikut obat penawar: blogs.msdn.com/b/ieinternals/archive/2010/03/30/...
Pankrat
1
@StephenSarcsamKamenar Jika Anda ingin melindungi situs Anda dari ditampilkan di iframe ada header X-Frame-Options yang tersedia dengan nilai SAMAORIGIN . Sebagian besar browser modern tidak akan menampilkan situs dalam iframe dengan header ini.
Grzegorz
4
Sayangnya sandboxtidak mengizinkan Flash atau objek jenis lain apa pun dalam bingkai berpasir, membuat sandboxfitur tersebut tidak berguna dalam banyak kasus.
oriadam
1
Situs web tidak boleh "keluar" untuk memprotes dimasukkan dalam iframe. Mereka hanya dapat menampilkan pesan atau kosong. Sayangnya, membiarkan skrip dijalankan di iframe masih membuka Anda ke iframe nakal yang melakukan sementara (1) {} dan loop tak terbatas lainnya. Saya berharap setiap iframe bisa mendapatkan utasnya sendiri.
Gregory Magarshak
51

Saya menggunakan kotak pasir = "..."

  • memungkinkan-formulir memungkinkan pengiriman formulir
  • allow-popup memungkinkan popup
  • allow-pointer-lock memungkinkan kunci penunjuk
  • allow-same-origin memungkinkan dokumen mempertahankan asalnya
  • allow-scripts memungkinkan eksekusi JavaScript, dan juga memungkinkan fitur untuk memicu secara otomatis
  • allow-top-navigation memungkinkan dokumen untuk keluar dari bingkai dengan menavigasi jendela tingkat atas

Navigasi teratas adalah apa yang ingin Anda cegah, jadi tinggalkan itu dan itu tidak akan diizinkan. Apa pun yang ditinggalkan akan diblokir

ex.

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
adigioia
sumber
3
Perhatikan bahwa Flash (dan objek lainnya) juga akan diblokir, tanpa opsi untuk mengizinkannya. "Fitur keamanan" ini mencegah saya menggunakan kotak pasir bersama
oriadam
8

Setelah membaca spesifikasi w3.org . Saya menemukan properti kotak pasir.

Anda dapat mengatur sandbox="", yang mencegah iframe dari redirect. Itu dikatakan tidak akan mengarahkan ulang iframe juga. Anda akan kehilangan klik pada dasarnya.

Contoh di sini: http://jsfiddle.net/ppkzS/1/
Contoh tanpa sandbox: http://jsfiddle.net/ppkzS/

Parris
sumber
4

Saya tahu ini sudah lama sejak pertanyaan dilakukan tetapi di sini adalah versi perbaikan saya akan menunggu 500ms untuk panggilan berikutnya hanya ketika iframe dimuat.

<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>

dan onload="frameLoad()"dan onreadystatechange="frameLoad();"harus ditambahkan ke bingkai atau iframe.

Luis Deleon
sumber
2

Karena halaman yang Anda muat di dalam iframe dapat mengeksekusi kode "break out" dengan setInterval, onbeforeunload mungkin tidak sepraktis itu, karena itu dapat membuat pengguna bingung dengan 'Apakah Anda yakin ingin keluar?' dialog.

Ada juga atribut keamanan iframe yang hanya berfungsi di IE & Opera

:(

pengguna47087
sumber
2

Dalam kasus saya, saya ingin pengguna mengunjungi halaman dalam sehingga server akan melihat ip mereka sebagai pengunjung. Jika saya menggunakan teknik proxy php saya pikir bahwa halaman dalam akan melihat server ip saya sebagai pengunjung sehingga tidak baik. Satu-satunya solusi yang saya dapatkan sejauh ini adalah onbeforeunload. Letakkan ini di halaman Anda:

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

Ini berfungsi baik di firefox dan ie, itulah yang saya uji. Anda akan menemukan versi menggunakan sesuatu seperti evt.return (apa pun) omong kosong ... yang tidak berfungsi di firefox.

Radu
sumber
0

Dengan melakukannya, Anda akan dapat mengontrol tindakan apa pun dari halaman berbingkai, yang tidak dapat Anda lakukan. Kebijakan asal domain yang sama berlaku.

Diodeus - James MacFarlane
sumber
20
Saya tidak meminta untuk mengontrol apa yang ada di dalam IFRAME. Saya meminta untuk mencegah apa yang ada di dalam IFRAME mengendalikan saya.
Jason Cohen