Upaya JavaScript yang tidak aman untuk mengakses bingkai dengan URL

112

Saya mendapatkan kesalahan di bawah ini ketika saya mencoba mengatur nilai hash ke url induk dari iframe yang berisi url domain lain:

Upaya JavaScript yang tidak aman untuk mengakses bingkai dengan URL "URL1" dari bingkai dengan URL "URL2". Domain, protokol, dan port harus cocok.

Bagaimana cara memperbaiki masalah ini?

Atul
sumber
3
Tambahkan lebih banyak detail, cuplikan kode, pesan kesalahan, kerangka kerja yang Anda gunakan .. Lebih banyak verbositas, lebih detail ..
fifigyuri
5
Bagaimana dengan saat Anda menerapkan plugin sosial g + 1, facebook like atau shre dan twitter yang dimuat di iframe dan menampilkan kesalahan yang sama?
Pertanyaannya adalah MENGAPA skrip Facebook dan Google bahkan MENCOBA mengakses elemen situs web saya.
sergio

Jawaban:

124

Dari dokumen anak asal berbeda Anda tidak diizinkan mengakses location.hashproperti jendela atas , tetapi Anda diizinkan untuk menyetel locationproperti itu sendiri.

Ini berarti bahwa mengingat lokasi jendela atas http://example.com/page/, bukan melakukan

parent.location.hash = "#foobar";

Anda perlu mengetahui lokasi orang tua dan melakukannya

parent.location = "http://example.com/page/#foobar";

Karena sumber daya tidak dinavigasi, ini akan bekerja seperti yang diharapkan, hanya mengubah bagian hash dari url.

Jika Anda menggunakan ini untuk komunikasi lintas domain, maka saya akan merekomendasikan menggunakan easyXDM sebagai gantinya.

Sean Kinsey
sumber
13
Tidak ada yang menandai ini sebagai jawaban, namun mendapat 60 suara positif. Harus ada lencana untuk ini.
zachzurn
35
Apa nama lencananya? "Menanggapi orang yang malas"
nzifnab
1
Hai @atul, jadilah baik dan tandai jawaban ini sebagai yang terbaik. Hormatilah konvensi yang memungkinkan kita semua mendapatkan keuntungan dari pengetahuan orang lain ...
Clint Eastwood
13

Crossframe-Scripting tidak dimungkinkan jika kedua frame memiliki domain yang berbeda -> Keamanan.

Lihat ini: http://javascript.about.com/od/reference/a/frame3.htm

Sekarang untuk menjawab pertanyaan Anda: tidak ada solusi atau solusi, Anda cukup memeriksa desain situs web Anda mengapa harus ada dua bingkai dari domain berbeda yang mengubah url yang lain.

EvilMM
sumber
82
Ini adalah persyaratan yang sering terjadi saat seseorang menyematkan aplikasi pihak ketiga ke situs web Anda, terutama di mana layanan web dan sejenisnya bukan merupakan pilihan.
Jacques
9

Saya mendapatkan pesan kesalahan yang sama ketika saya mencoba mengubah domain untuk iframe.src.

Bagi saya, jawabannya adalah mengubah iframe.src menjadi url di domain yang SAMA, tetapi sebenarnya merupakan halaman html yang mengarahkan ulang ke domain yang diinginkan. Domain lain kemudian muncul di iframe saya tanpa kesalahan.

Bekerja seperti pesona. :)

Tommy
sumber
bisakah Anda menjelaskan lebih lanjut tentang apa yang Anda lakukan di sini?
Devin G Rhode
akan sangat membantu jika Anda bisa menjelaskan secara singkat.
Madhusudhan
2
Tidak berfungsi di Chrome terbaru: tidak memeriksa parameter src, tetapi URL aktual dimuat. Jadi trik pengalihan sayangnya tidak membantu dengan cara apa pun :-(
lucaferrario
3
Saya yakin yang dimaksud Tommy adalah proxy sisi server. Lihat misalnya benalman.com/projects/php-simple-proxy atau developer.yahoo.com/javascript/howto-proxy.html atau google.com/… atau solusi René de Kat di stackoverflow.com/a/11224975/27938
Oskar Austegard
Itu rapi. Tetapi itu hanya menggambarkan betapa umumnya sepele untuk menyiasati hal ini. Oke, anggap saja saya adalah peretas jahat yang jahat, dan saya ingin menjalankan serangan skrip lintas domain. Kemungkinan saya akan mengetahui tentang alat-alat ini, dan menggunakannya. Sejauh perbaikan keamanan browser, ini semudah terbelakang karena IE tidak membiarkan Anda menjalankan Javascript secara lokal tanpa peringatan. Tidak ada masalah. Membuat banyak yang baru.
Yitzhak
6

Solusinya bisa dengan menggunakan file lokal yang mengambil konten jarak jauh

remoteInclude.php

<?php
$url = $_GET['url'];
$contents = file_get_contents($url);
echo $contents;

HTML

<iframe frameborder="1" id="frametest" src="/remoteInclude.php?url=REMOTE_URL_HERE"></iframe>
<script>
    $("#frametest").load(function (){       
    var contents =$("#frametest").contents();
});


sumber
1
Ini membuka pintu untuk kerentanan pembuatan skrip lintas situs. Contoh kemungkinan serangan: 1. Saya membuat halaman di myevilserver.com yang terlihat seperti situs Anda, termasuk formulir login yang diposkan kembali ke myevilserver.com 2. Saya mengirimkan buletin palsu kepada pengguna Anda dengan tautan ke https: // yoursite.com/remoteInclude.php?url=myevilserver.com 3. Mereka melihat formulir login di situs Anda yang saya tangkap di server saya.
EricP
2
Solusi yang mungkin adalah membuat remoteInclude.php memeriksa semua url terhadap daftar domain yang telah disetujui sebelumnya.
EricP
Ini tidak menyelesaikan masalah kerentanan pembuatan skrip lintas situs. Sama sekali tidak ada yang dapat saya lakukan dengan Javascript ke situs web eksternal yang tidak dapat saya lakukan dari sisi server. Semua ini menghalangi browser itu sendiri dan membuat aplikasi web menjadi kurang berguna dengan melakukan langkah tambahan. Anda masih dapat melakukan semua hal ini jika Anda memuat melalui ajax, menulis ulang tautan, dan memposting kembali. Jika itu tidak berhasil, remote rpc melalui php atau bahasa apapun. Tidak masuk akal bahwa ini bahkan menjadi masalah bagi pembuat kode rata-rata.
Yitzhak
3

Saya menemukan bahwa menggunakan versi XFBML dari tombol suka Facebook alih-alih versi HTML5 memperbaiki masalah ini. Tambahkan kode di bawah ini di mana Anda ingin tombol itu muncul:

<div id="fb-root"></div>
<script>(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<fb:like send="true" layout="button_count" width="50" show_faces="false" font="arial"></fb:like>

Kemudian tambahkan ini ke tag HTML Anda:

 xmlns:fb="http://ogp.me/ns/fb#"
Luke Alderton
sumber
2
Apa hubungannya Facebook dengan pertanyaan ini?
Kukks
16
Karena Anda juga mendapatkan kesalahan ini di tombol suka facebook dan saya menemukan halaman ini ketika mencari jawaban jadi saya pikir orang lain mungkin membutuhkan jawabannya.
Luke Alderton
1

Masalahnya adalah meskipun Anda membuat proxy atau memuat konten dan memasukkannya seolah-olah itu lokal, skrip apa pun yang didefinisikan konten tersebut akan dimuat dari domain lain dan menyebabkan masalah lintas domain.

pengguna2345833
sumber