Akses URL induk dari iframe


187

Oke, saya punya halaman di dan di halaman ini saya punya iframe. Apa yang perlu saya lakukan adalah di halaman iframe, cari tahu apa URL halaman utama itu.

Saya telah mencari-cari dan saya tahu bahwa ini tidak mungkin jika halaman iframe saya berada di domain yang berbeda, karena itu adalah skrip lintas situs. Tetapi di mana-mana saya baca mengatakan bahwa jika halaman iframe berada pada domain yang sama dengan halaman induk, itu harus berfungsi jika saya lakukan misalnya:

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

... atau kombo serupa lainnya, karena tampaknya ada beberapa cara untuk mendapatkan info yang sama.

Bagaimanapun, jadi inilah masalahnya. Iframe saya ada di domain yang sama dengan halaman utama, tetapi tidak di domain SUB yang sama. Jadi misalnya saya punya

http: // www.mysite.com/pageA.html

dan kemudian URL iframe saya adalah

http: // qa-www.mysite.com/pageB.html

Ketika saya mencoba mengambil URL dari pageB.html(halaman iframe), saya terus mendapatkan kesalahan ditolak akses yang sama. Jadi tampaknya bahkan sub-domain dihitung sebagai skrip lintas situs, apakah itu benar, atau apakah saya melakukan sesuatu yang salah?


Bisakah Anda meneruskannya di frame URL? Seperti<iframe src="url?parent=parent-url"></iframe>
Biagio Arobba

Jawaban:


21

Kamu benar. Subdomain masih dianggap sebagai domain terpisah saat menggunakan iframe. Dimungkinkan untuk meneruskan pesan menggunakan postMessage(...), tetapi API JS lainnya sengaja dibuat tidak dapat diakses.

URL juga masih mungkin tergantung pada konteksnya. Lihat jawaban lain untuk lebih jelasnya.


1
Oke, itu baru saja meledak. Tapi setidaknya saya tahu saya tidak akan gila :( ah baiklah, rencanakan B. terima kasih. (Dan maaf karena tidak menaruh barang-barang saya di tag, terima kasih untuk hasil editnya)
chronofwar

9
bagaimana ini menjadi jawaban yang dipilih? ada uraian yang lebih baik tentang kemungkinan solusi di bawah ini.
Anoyz

1
Sepakat! Jawaban di bawah ini dengan 80 suara jauh lebih baik. Jawaban ini ada dalam spesifikasi html.
Ligemer

4
Anda BISA berinteraksi di antara 2. Tetapi Anda harus menambahkan skrip berikut di kedua induk dan iframe: <script> document.domain = "mydomain.com"; </script>
George

2
"Lihat jawaban lain untuk lebih jelasnya." hahah Ini seperti: Saya tidak punya solusi, melihat jawaban lain, tetapi menerima jawaban saya juga.
Milad

371

Ya, mengakses URL halaman induk tidak diizinkan jika iframe dan halaman utama tidak dalam domain (sub) yang sama. Namun, jika Anda hanya perlu URL halaman utama (yaitu URL browser), Anda dapat mencoba ini:

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

catatan:

window.parent.locationDiperbolehkan; itu menghindari kesalahan keamanan dalam OP, yang disebabkan oleh mengakses hrefproperti: window.parent.location.hrefmenyebabkan "Memblokir bingkai dengan asal ..."

document.referrermerujuk ke "URI halaman yang terhubung ke halaman ini." Ini mungkin tidak mengembalikan dokumen yang berisi jika beberapa sumber lain yang menentukan iframelokasi, misalnya:

  • Kontainer iframe @ Domain 1
  • Mengirim iframe anak ke Domain 2
  • Tetapi pada iframe anak ... Domain 2 mengalihkan ke Domain 3 (yaitu untuk otentikasi, mungkin SAML), dan kemudian Domain 3 mengarahkan kembali ke Domain 2 (yaitu melalui pengiriman formulir (), teknik SAML standar)
  • Untuk anak iframe yang document.referrerakan menjadi Domain 3 , bukan yang mengandung Domain 1

document.locationmerujuk ke "objek Lokasi, yang berisi informasi tentang URL dokumen"; mungkin dokumen saat ini, yaitu iframe saat ini terbuka. Ketika window.location === window.parent.location, maka iframe ini hrefadalah sama sebagai induk mengandung Ini href.


1
@ jepser itu karena iframe Anda ada di dalam iframe itu. Anda tidak akan pernah memiliki akses ke bingkai atas dengan yang di tengah. iframe lintas domain bersarang salah pada banyak tingkatan. tetapi Anda mungkin bisa menyiasatinya jika Anda mengatur document.domainbingkai paling atas dan paling dalam. mungkin.
gcb

2
Atau, sedikit lebih kompak:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth

2
Harap dicatat bahwa itu tidak berfungsi jika wadah tersebut berada di localhost Anda (atau lebih umum, jika halaman ini tidak dibuka oleh server web) atau dipanggil dengan file: //.
Guillaume Renoult

5
Perlu dicatat bahwa ini dapat dikalahkan dengan Referer-Policytajuk.
Dan Atkinson

2
Ini sepertinya tidak berfungsi dengan browser Edge - pengarah akan berupa string kosong .. stackoverflow.com/questions/24169219/…
Davide Orazio Montersino

52

Saya baru saja menemukan solusi untuk masalah ini yang sangat sederhana, namun saya belum menemukan diskusi di mana pun yang menyebutkannya. Itu memang membutuhkan kontrol dari frame induk.

Di iFrame Anda, katakan Anda menginginkan iframe ini: src = "http://www.example.com/mypage.php"

Nah, alih-alih HTML untuk menentukan iframe, gunakan javascript untuk membangun HTML untuk iframe Anda, dapatkan url induk melalui javascript "at build time", dan kirim sebagai parameter GET url dalam querystring target src Anda, seperti begitu:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

Kemudian, cari sendiri fungsi parsing url javascript yang mem-parsing string url untuk mendapatkan variabel url yang Anda cari, dalam hal ini "url".

Saya menemukan parser string url yang bagus di sini: http://www.netlobo.com/url_query_string_javascript.html


Jawaban ini dikombinasikan dengan stackoverflow.com/a/7739035/216084 menyelesaikan pekerjaan.

2
Ini saran yang bagus. Bagi mereka yang menulis kode iframe html induk ini akan membayar tagihan. Kami menggunakan sesuatu yang sangat mirip dalam perangkat lunak piksel kami.
Ligemer

Terima kasih!! Ini adalah solusi efektif yang masih menghormati aturan lintas situs.
theUtherSide

Tetapi apakah Anda menulis ulang semua url di html di server? Karena kalau tidak, ketika pengguna mengklik tautan di iFrame itu masih tidak dapat diakses.
Roel

@Roel Anda dapat menulis semuanya pada waktu server (pada intinya, "kode keras" jawaban ini), atau jawaban ini dapat Anda lakukan dalam javascript, misalnya setelah halaman dimuat, ia menyuntikkan iframe yang diinginkan.
rogerdpack

34

Jika iframe Anda dari domain lain, (lintas domain), Anda hanya perlu menggunakan ini:

var currentUrl = document.referrer;

dan - di sini Anda mendapatkan url utama!


Itu tidak berhasil dalam kasus saya karena saya pikir iFrame itu sendiri telah dihasilkan secara dinamis atau melakukan beberapa tipu daya lainnya. Saya tidak mendapatkan jawaban yang saya harapkan.
Muskie

ini harus bekerja di semua browser. Kecuali di browser yang lebih baru jika Anda mengirim parameter Sandboxing, tetapi saya ragu ini masalahnya. Ini berfungsi terlepas dari lintas domain.
gcb

Jika halaman di dalam iframe dimuat ulang sendiri melalui javascript (mis. window.location.reload(true)) Ini tidak berfungsi lagi. Maka referer adalah URL iframe itu sendiri.
mori

20

Untuk halaman di domain yang sama dan subdomain yang berbeda, Anda dapat mengatur document.domainproperti melalui javascript.

Baik frame induk dan iframe perlu mengatur document.domain mereka ke sesuatu yang umum di antara mereka.

yaitu www.foo.mydomain.comdan api.foo.mydomain.commasing-masing dapat menggunakan salah satu foo.mydomain.comatau hanya mydomain.comdan kompatibel (tidak, Anda tidak dapat mengatur keduanya untuk com, karena alasan keamanan ...)

juga, perhatikan bahwa document.domain adalah jalan satu arah. Pertimbangkan menjalankan tiga pernyataan berikut secara berurutan:

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

Browser modern juga dapat menggunakan window.postMessage untuk berbicara lintas asal, tetapi tidak akan berfungsi di IE6. https://developer.mozilla.org/en/DOM/window.postMessage


3
Terima ini sebagai jawabannya, karena sekarang ini memungkinkan dan jawaban ini muncul dalam pencarian Google.
Metagrapher

17

Baris berikut akan berfungsi: yang document.location.ancestorOrigins[0]ini mengembalikan nama domain leluhur.


Mengikuti perubahan yang dibuat untuk Chrome, ini sekarang jawaban yang benar untuk banyak browser.
Dan Atkinson

Bukan url penuh sekalipun. Hanya domain
TheMaster

document.location.ancestorOriginskembali undefineduntuk saya
Miguel Mota

Mengenai dukungan browser, khususnya, pada Juli 2020, leluhurOrigins belum didukung di Firefox karena masalah privasi. Permintaan dan diskusi fitur Bugzilla: bugzilla.mozilla.org/show_bug.cgi?id=1085214 . Dukungan peramban: caniuse.com/#search=ancestorOrigins
colin moock


2

Saya punya masalah dengan ini. Jika menggunakan bahasa seperti php saat laman Anda pertama kali memuat iframe grab$_SERVER['HTTP_REFFERER'] dan atur ke variabel sesi.

Dengan cara ini ketika halaman dimuat di iframe Anda tahu url induk lengkap dan string kueri dari halaman yang memuatnya. Dengan keamanan lintas browser itu sedikit sakit kepala mengandalkan window.parent apa pun jika Anda domain yang berbeda.


2
var url = (window.location != window.parent.location) ? document.referrer: document.location;

Saya menemukan bahwa contoh di atas menyarankan bekerja sebelumnya ketika skrip dieksekusi di iframe namun tidak mengambil url ketika skrip dieksekusi di luar iframe, diperlukan sedikit penyesuaian:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;

2
Jika Anda berada di luar iframe maka Anda menjalankan skrip ON frame induk, Anda tidak perlu memeriksa apa pun.
Art3mix

1

Saya tidak bisa mendapatkan solusi sebelumnya untuk bekerja tetapi saya menemukan bahwa jika saya mengatur scr iframe dengan misalnya http:otherdomain.com/page.htm?from=thisdomain.com/thisfoldermaka saya bisa, dalam ekstrak iframe thisdomain.com/thisfolderdengan menggunakan javascript berikut:

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];

1

Masalahnya dengan PHP $ _SERVER ['HTTP_REFFERER'] adalah ia memberikan url halaman yang sepenuhnya memenuhi syarat dari halaman yang membawa Anda ke halaman induk. Itu tidak sama dengan halaman induk, itu sendiri. Lebih buruk lagi, terkadang tidak ada http_referer, karena orang tersebut mengetikkan url dari halaman induknya. Jadi, jika saya sampai ke halaman orang tua Anda dari yahoo.com, maka yahoo.com menjadi http_referer, bukan halaman Anda.


1

Saya telah menemukan dalam kasus di mana $_SERVER['HTTP_REFERER']tidak berfungsi (saya sedang melihat Anda, Safari), $_SERVER['REDIRECT_SCRIPT_URI']telah menjadi cadangan yang berguna.


0

Di chrome dimungkinkan untuk menggunakan location.ancestorOrigins Ini akan mengembalikan semua url induk


0

Saya tahu itu super tua tapi itu menghembus pikiran saya tidak ada yang merekomendasikan hanya melewati cookie dari satu domain ke domain lainnya. Saat Anda menggunakan subdomain, Anda dapat membagikan cookie dari domain dasar ke semua subdomain hanya dengan menyetel cookie ke url.basedomain.com

Kemudian Anda dapat membagikan data apa pun yang Anda butuhkan melalui cookie.



-4

Dapatkan semua fungsi Iframe Induk dan HTML

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;

Saya tidak mengira Anda dapat memperluas jawaban ini bagi kita yang tidak menggunakan jQuery (angka yang terus bertambah, saya harus tunjukkan, karena jQuery telah menjadi semakin tidak perlu selama beberapa tahun terakhir). Paling tidak, saya sarankan memperjelas jawaban ini tergantung pada jQuery dan OP tidak menyebutkan jQuery sama sekali.
Carnix
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.