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.


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/


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


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


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>

3
Perhatikan bahwa Flash (dan objek lainnya) juga akan diblokir, tanpa opsi untuk mengizinkannya. "Fitur keamanan" ini mencegah saya menggunakan kotak pasir bersama
oriadam


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.



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

:(


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.