เข้าถึง URL หลักจาก iframe


187

โอเคฉันมีหน้าและบนหน้านี้ฉันมี iframe สิ่งที่ฉันต้องทำคือในหน้า iframe ดูว่า URL ของหน้าหลักคืออะไร

ฉันค้นหารอบ ๆ และรู้ว่านี่เป็นไปไม่ได้หากหน้า iframe ของฉันอยู่ในโดเมนอื่นเนื่องจากเป็นสคริปต์ข้ามไซต์ แต่ทุกที่ที่ฉันอ่านบอกว่าถ้าหน้า iframe อยู่ในโดเมนเดียวกับหน้าหลักมันควรจะทำงานได้ถ้าฉันทำเช่น:

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

... หรือคอมโบที่คล้ายกันอื่น ๆ เนื่องจากมีหลายวิธีในการรับข้อมูลเดียวกัน

ยังไงก็ตามนี่คือปัญหา iframe ของฉันอยู่ในโดเมนเดียวกับหน้าหลัก แต่ไม่ได้อยู่ในโดเมน SUB เดียวกัน เช่นฉันมี

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

และ URL iframe ของฉันคือ

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

เมื่อฉันพยายามที่จะคว้า URL จากpageB.html(หน้า iframe) ฉันได้รับข้อผิดพลาดการปฏิเสธการเข้าถึงเดียวกัน ดังนั้นจึงปรากฏว่าแม้กระทั่งโดเมนย่อยก็ถือว่าการเขียนสคริปต์ข้ามไซต์นั้นถูกต้องหรือฉันทำอะไรผิดหรือเปล่า?


คุณสามารถส่งมันผ่าน URL เฟรมหรือไม่? เช่น<iframe src="url?parent=parent-url"></iframe>
Biagio Arobba

คำตอบ:


21

คุณถูกต้อง โดเมนย่อยยังถือว่าเป็นโดเมนแยกต่างหากเมื่อใช้ iframes เป็นไปได้ที่จะส่งข้อความโดยใช้postMessage(...)แต่ API ของ JS อื่นไม่สามารถเข้าถึงได้โดยเจตนา

นอกจากนี้ยังเป็นไปได้ที่จะได้รับ URL ขึ้นอยู่กับบริบท ดูคำตอบอื่น ๆ สำหรับรายละเอียดเพิ่มเติม


1
โอเคที่เพิ่งระเบิด แต่อย่างน้อยฉันก็รู้ว่าฉันจะไม่บ้า :( เอาล่ะวางแผน B. ขอบคุณ (และขอโทษที่ไม่ใส่สิ่งของในแท็กขอบคุณสำหรับการแก้ไข)
chronofwar

9
นี่เป็นคำตอบที่เลือกอย่างไร มีคำอธิบายวิธีแก้ไขที่เป็นไปได้ด้านล่าง
Anoyz

1
ตกลงกัน! คำตอบด้านล่างมี 80 คะแนนดีกว่ามาก คำตอบนี้อยู่ในข้อมูลจำเพาะ html
Ligemer

4
คุณสามารถโต้ตอบระหว่าง 2 ได้ แต่คุณต้องเพิ่มสคริปต์ต่อไปนี้บนทั้งพาเรนต์และ iframe: <script> document.domain = "mydomain.com"; </script>
จอร์จ

2
"ดูคำตอบอื่น ๆ สำหรับรายละเอียดเพิ่มเติม" ฮ่าฮ่ามันเป็นแบบ: ฉันไม่มีวิธีแก้ปัญหาดูคำตอบอื่น ๆ แต่ยอมรับคำตอบของฉันด้วย
Milad

371

ใช่ไม่อนุญาตให้เข้าถึง URL ของหน้าหลักหาก iframe และหน้าหลักไม่ได้อยู่ในโดเมน (ย่อย) เดียวกัน อย่างไรก็ตามหากคุณต้องการ URL ของหน้าหลัก (เช่น URL เบราว์เซอร์) คุณสามารถลอง:

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

บันทึก:

window.parent.locationได้รับอนุญาต; มันหลีกเลี่ยงข้อผิดพลาดด้านความปลอดภัยใน OP ซึ่งเกิดจากการเข้าถึงhrefคุณสมบัติ: window.parent.location.hrefสาเหตุ "บล็อกเฟรมที่มีจุดเริ่มต้น ... "

document.referrerอ้างถึง "URI ของหน้าเว็บที่เชื่อมโยงกับหน้านี้" สิ่งนี้อาจไม่ส่งคืนเอกสารที่มีหากแหล่งข้อมูลอื่นเป็นสิ่งที่กำหนดiframeสถานที่ตัวอย่างเช่น

  • คอนเทนเนอร์ iframe @ โดเมน 1
  • ส่ง child iframe ไปที่ Domain 2
  • แต่ใน iframe ลูก ... โดเมน 2 เปลี่ยนเส้นทางไปยังโดเมน 3 (เช่นสำหรับการตรวจสอบสิทธิ์อาจเป็น SAML) จากนั้นโดเมน 3 จะนำกลับไปที่โดเมน 2 (เช่นผ่านการส่งแบบฟอร์ม () ซึ่งเป็นเทคนิค SAML มาตรฐาน)
  • สำหรับเด็ก iframe document.referrerจะเป็นโดเมน3ไม่ใช่โดเมน1 ที่มี

document.locationอ้างถึง "วัตถุที่ตั้งซึ่งมีข้อมูลเกี่ยวกับ URL ของเอกสาร"; สันนิษฐานว่าเป็นเอกสารปัจจุบันนั่นคือ iframe เปิดอยู่ในปัจจุบัน เมื่อwindow.location === window.parent.locationใดดังนั้น iframe hrefจะเหมือนกับของ parent ที่มีhrefอยู่


1
@ jepser นั่นเป็นเพราะ iframe ของคุณอยู่ใน iframe นั้น คุณจะไม่สามารถเข้าถึงเฟรมด้านบนที่อยู่ตรงกลาง iframe ข้ามโดเมนที่ซ้อนกันผิดในหลายระดับ แต่คุณอาจสามารถหลีกเลี่ยงได้ถ้าคุณตั้งไว้document.domainที่เฟรมด้านบนและด้านในสุด อาจจะ.
gcb

2
หรือมากกว่าเล็กน้อยดาน:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth

2
โปรดทราบว่ามันใช้งานไม่ได้หากคอนเทนเนอร์ตั้งอยู่บนโลคัลโฮสต์ของคุณ (หรือมากกว่าปกติหากหน้าเว็บนี้ไม่ได้เปิดโดยเว็บเซิร์ฟเวอร์) หรือเรียกโดยไฟล์: //
Guillaume Renoult

5
ควรสังเกตว่าเรื่องนี้สามารถเอาชนะได้ด้วยReferer-Policyส่วนหัว
Dan Atkinson

2
ดูเหมือนจะไม่ทำงานกับเบราว์เซอร์ Edge - ผู้อ้างอิงจะเป็นสตริงว่าง .. stackoverflow.com/questions/24169219//
Davide Orazio Montersino

51

ฉันเพิ่งค้นพบวิธีแก้ปัญหาสำหรับปัญหานี้ที่ง่ายมาก แต่ฉันยังไม่พบการสนทนาใด ๆ ที่กล่าวถึง มันต้องการการควบคุมเฟรมหลัก

ใน iFrame ของคุณสมมติว่าคุณต้องการ iframe นี้: src = "http://www.example.com/mypage.php"

ดีแทนที่จะใช้ HTML เพื่อระบุ iframe ให้ใช้ javascript เพื่อสร้าง HTML สำหรับ iframe ของคุณรับ url พาเรนต์ผ่าน javascript "เวลา build" และส่งเป็นพารามิเตอร์ url GET ในการสอบถามเป้าหมาย src ของคุณเช่น ดังนั้น:

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

จากนั้นค้นหาฟังก์ชัน javascript url สำหรับวิเคราะห์คำที่แยกวิเคราะห์สตริง url เพื่อรับตัวแปร url ที่คุณอยู่ในกรณีนี้คือ "url"

ฉันพบตัวแยกวิเคราะห์สตริง URL ที่ดีที่นี่: http://www.netlobo.com/url_query_string_javascript.html


คำตอบนี้รวมกับstackoverflow.com/a/7739035/216084ทำให้งานเสร็จ

2
นี่เป็นคำแนะนำที่ยอดเยี่ยม สำหรับผู้ที่กำลังเขียนโค้ด html iframe หลักจะต้องเสียค่าใช้จ่าย เราใช้สิ่งที่คล้ายกันมากในซอฟต์แวร์พิกเซลของเรา
Ligemer

ขอบคุณ!! นี่เป็นการแก้ไขที่มีประสิทธิภาพซึ่งยังคงเคารพกฎข้ามไซต์
theUtherSide

แต่คุณเขียน URL ทั้งหมดใน html ที่เซิร์ฟเวอร์อีกครั้งหรือไม่ เพราะมิฉะนั้นเมื่อผู้ใช้คลิกลิงค์ใน iFrame มันจะยังไม่สามารถเข้าถึงได้
Roel

@Roel คุณสามารถเขียนพวกเขาทั้งหมดในเวลาเซิร์ฟเวอร์ (ในสาระสำคัญ "รหัสยาก" คำตอบนี้) หรือคำตอบนี้คุณสามารถทำได้ในจาวาสคริปต์เช่นหลังจากหน้าโหลดมันฉีด iframes ที่ต้องการ
rogerdpack

34

หาก iframe ของคุณมาจากโดเมนอื่น (ข้ามโดเมน) คุณจะต้องใช้สิ่งนี้:

var currentUrl = document.referrer;

และ - ที่นี่คุณมี URL หลัก!


ไม่ได้ผลในกรณีของฉันเพราะฉันคิดว่าตัว iFrame นั้นถูกสร้างขึ้นแบบไดนามิกหรือมีเล่ห์เหลี่ยมอื่น ๆ ฉันไม่ได้รับคำตอบเท่าที่ควร
Muskie

สิ่งนี้น่าจะใช้ได้กับทุกเบราว์เซอร์ ยกเว้นในเบราว์เซอร์ที่ใหม่กว่าถ้าคุณส่งพารามิเตอร์ Sandboxing แต่ฉันสงสัยว่าเป็นกรณีนี้ สิ่งนี้ใช้ได้โดยไม่คำนึงถึงการข้ามโดเมน
gcb

หากหน้าเว็บใน iframe โหลดซ้ำตัวเองผ่าน javascript (เช่นwindow.location.reload(true)) สิ่งนี้จะไม่ทำงานอีก จากนั้นผู้อ้างอิงคือ URL ของ iframe นั้นเอง
mori

20

สำหรับหน้าในโดเมนเดียวกันและโดเมนย่อยอื่นคุณสามารถตั้งค่าdocument.domainคุณสมบัติผ่านทางจาวาสคริปต์

ทั้งเฟรมหลักและ iframe จำเป็นต้องตั้งค่า document.domain ของพวกเขาเป็นสิ่งที่เป็นเรื่องธรรมดาระหว่างพวกเขา

คือ www.foo.mydomain.comและapi.foo.mydomain.comสามารถใช้งานแต่ละอย่างไม่ว่าจะเป็นfoo.mydomain.comหรือเพียงแค่mydomain.comและเข้ากันได้ (ไม่คุณไม่สามารถตั้งค่าทั้งสองเป็นcomเพื่อความปลอดภัย ... )

โปรดทราบว่า document.domain เป็นถนนเดินรถทางเดียว พิจารณาการเรียกใช้สามข้อความต่อไปนี้ตามลำดับ:

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

เบราว์เซอร์สมัยใหม่ยังสามารถใช้ window.postMessage เพื่อพูดคุยกับต้นกำเนิดได้ แต่จะไม่ทำงานใน IE6 https://developer.mozilla.org/en/DOM/window.postMessage


3
โปรดยอมรับสิ่งนี้เป็นคำตอบเมื่อเป็นไปได้และเป็นไปได้ที่คำตอบนี้จะปรากฏในการค้นหาของ Google
Metagrapher

17

บรรทัดต่อไปนี้จะใช้งานได้: อันdocument.location.ancestorOrigins[0]นี้ส่งคืนชื่อโดเมนบรรพบุรุษ


การติดตามการเปลี่ยนแปลงที่เกิดขึ้นกับ Chrome ตอนนี้เป็นคำตอบที่ถูกต้องสำหรับเบราว์เซอร์จำนวนมาก
Dan Atkinson

ไม่ใช่ URL แบบเต็มแม้ว่า เฉพาะโดเมน
TheMaster

document.location.ancestorOriginsส่งคืนundefinedสำหรับฉัน
Miguel Mota

เกี่ยวกับการสนับสนุนเบราว์เซอร์โดยเฉพาะเมื่อเดือนกรกฎาคม 2563 บรรพบุรุษยังไม่ได้รับการสนับสนุนใน Firefox เนื่องจากปัญหาความเป็นส่วนตัว Bugzilla คำขอคุณสมบัติและการอภิปราย: bugzilla.mozilla.org/show_bug.cgi?id=1085214 การสนับสนุนเบราว์เซอร์: caniuse.com/#search=ancestorOrigins
colin moock


2

ฉันมีปัญหากับสิ่งนี้ หากใช้ภาษาอย่าง PHP เมื่อหน้าเว็บของคุณโหลดใน iframe grab เป็นครั้งแรก$_SERVER['HTTP_REFFERER']แล้วตั้งเป็นตัวแปรเซสชัน

วิธีนี้เมื่อเพจโหลดใน iframe คุณจะรู้ URL หลักและสตริงการสืบค้นของเพจที่โหลด ด้วยการรักษาความปลอดภัยข้ามเบราว์เซอร์มันเป็นเรื่องที่น่าปวดหัวนับขึ้นอยู่กับ window.parent อะไรถ้าคุณคุณโดเมนที่แตกต่างกัน


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

ฉันพบว่าตัวอย่างข้างต้นที่แนะนำทำงานก่อนหน้านี้เมื่อสคริปต์ถูกเรียกใช้งานใน iframe แต่ไม่ได้เรียก url เมื่อสคริปต์ถูกเรียกใช้นอก iframe จำเป็นต้องทำการปรับเปลี่ยนเล็กน้อย:

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

2
หากคุณอยู่นอก iframe แสดงว่าคุณกำลังเรียกใช้สคริปต์บนเฟรมหลักคุณไม่จำเป็นต้องตรวจสอบอะไรเลย
Art3mix

1

ฉันไม่สามารถหาวิธีแก้ไขปัญหาก่อนหน้านี้เพื่อทำงาน แต่ฉันพบว่าถ้าฉันตั้งค่า iframe scr ด้วยเช่นhttp:otherdomain.com/page.htm?from=thisdomain.com/thisfolderนั้นฉันสามารถทำได้ใน iframe แยกthisdomain.com/thisfolderโดยใช้จาวาสคริปต์ต่อไปนี้:

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

1

ปัญหาเกี่ยวกับ PHP $ _SERVER ['HTTP_REFFERER'] คือการให้ URL ของหน้าที่ผ่านการรับรองโดยสมบูรณ์ของหน้าเว็บที่นำคุณไปสู่หน้าหลัก นั่นไม่เหมือนกับเพจระดับบน ที่แย่กว่านั้นคือบางครั้งไม่มี http_referer เพราะบุคคลที่พิมพ์ใน url ของหน้าหลัก ดังนั้นถ้าฉันไปที่หน้าแม่ของคุณจาก yahoo.com แล้ว yahoo.com จะกลายเป็น http_referer ไม่ใช่หน้าเว็บของคุณ


1

ฉันพบในกรณีที่$_SERVER['HTTP_REFERER']ใช้งานไม่ได้ (ฉันกำลังดูคุณ Safari) $_SERVER['REDIRECT_SCRIPT_URI']เป็นข้อมูลสำรองที่มีประโยชน์


0

ในโครเมี่ยมเป็นไปได้ที่จะใช้ location.ancestorOrigins มันจะกลับ URL ของผู้ปกครองทั้งหมด


0

ฉันรู้ว่าเขาอายุมาก แต่มันทำให้ฉันคิดว่าไม่มีใครแนะนำให้ส่งคุกกี้จากโดเมนหนึ่งไปยังอีกโดเมนหนึ่ง ในขณะที่คุณใช้โดเมนย่อยคุณสามารถแบ่งปันคุกกี้จากโดเมนพื้นฐานไปยังโดเมนย่อยทั้งหมดเพียงแค่ตั้งค่าคุกกี้ไปยัง URL.basedomain.com

จากนั้นคุณสามารถแบ่งปันข้อมูลใด ๆ ที่คุณต้องการผ่านคุกกี้



-4

รับฟังก์ชั่น Parent Iframe ทั้งหมดและ 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;

ฉันไม่คิดว่าคุณสามารถขยายคำตอบนี้สำหรับพวกเราที่ไม่ได้ใช้ jQuery (ตัวเลขที่เพิ่มขึ้นฉันควรชี้ให้เห็นเนื่องจาก jQuery ได้เพิ่มขึ้นโดยไม่จำเป็นในช่วงสองสามปีที่ผ่านมา) อย่างน้อยที่สุดฉันแนะนำให้ชัดเจนว่าคำตอบนี้ขึ้นอยู่กับ jQuery และ OP ไม่ได้พูดถึง jQuery เลย
Carnix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.