JavaScript ที่ไม่ปลอดภัยพยายามเข้าถึงเฟรมด้วย URL


112

ฉันได้รับข้อผิดพลาดด้านล่างเมื่อฉันพยายามตั้งค่าแฮชเป็น URL หลักจาก iframe ซึ่งมี URL ของโดเมนอื่น:

JavaScript ที่ไม่ปลอดภัยพยายามเข้าถึงเฟรมด้วย URL "URL1" จากเฟรมที่มี URL "URL2" โดเมนโปรโตคอลและพอร์ตต้องตรงกัน

ฉันจะแก้ไขปัญหานี้ได้อย่างไร?


3
กรุณาเพิ่มรายละเอียดข้อมูลโค้ดข้อความแสดงข้อผิดพลาดเฟรมเวิร์กที่คุณใช้ .. รายละเอียดเพิ่มเติมรายละเอียดเพิ่มเติม ..
fifigyuri

5
แล้วเมื่อคุณใช้ปลั๊กอินโซเชียล g + 1, facebook like หรือ shre และ twitter ที่โหลดใน iframe และเกิดข้อผิดพลาดเดียวกัน

คำถามคือทำไมสคริปต์ของ Facebook และ Google ถึงพยายามเข้าถึงองค์ประกอบเว็บไซต์ของฉัน
เซร์คิโอ

คำตอบ:


124

จากเอกสารลูกที่มีต้นกำเนิดต่างกันคุณไม่ได้รับอนุญาตให้เข้าถึงlocation.hashคุณสมบัติของหน้าต่างด้านบนแต่คุณได้รับอนุญาตให้ตั้งค่าlocationคุณสมบัตินั้นเอง

ซึ่งหมายความว่าเนื่องจากตำแหน่งหน้าต่างด้านบนเป็นhttp://example.com/page/แทนที่จะทำ

parent.location.hash = "#foobar";

คุณจำเป็นต้องรู้ตำแหน่งของผู้ปกครองและทำ

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

เนื่องจากทรัพยากรไม่ได้รับการสำรวจสิ่งนี้จะทำงานได้ตามที่คาดไว้จึงเปลี่ยนเฉพาะส่วนแฮชของ url เท่านั้น

หากคุณใช้สิ่งนี้เพื่อการสื่อสารข้ามโดเมนฉันขอแนะนำให้ใช้easyXDMแทน


13
ไม่มีใครทำเครื่องหมายว่านี่เป็นคำตอบและยังมี 60 โหวต ควรมีตราสำหรับสิ่งนี้
zachzurn

35
ตราจะเรียกว่าอะไร? "ตอบสนองคนขี้เกียจ"
nzifnab

1
เฮ้ @atul ใจดีและทำเครื่องหมายว่าคำตอบนี้เป็นคำตอบที่ดีที่สุด เคารพอนุสัญญาที่ให้เราทุกคนได้รับประโยชน์จากความรู้ของผู้อื่น ...
Clint Eastwood

13

Crossframe-Scripting ไม่สามารถทำได้เมื่อทั้งสองเฟรมมีโดเมนต่างกัน -> Security

ดูสิ่งนี้: http://javascript.about.com/od/reference/a/frame3.htm

ตอนนี้เพื่อตอบคำถามของคุณ: ไม่มีวิธีแก้ปัญหาหรือวิธีแก้ไขคุณควรตรวจสอบการออกแบบเว็บไซต์ของคุณว่าเหตุใดจึงต้องมีสองเฟรมจากโดเมนที่ต่างกันซึ่งเปลี่ยน url ของอีกโดเมนหนึ่ง


82
นี่เป็นข้อกำหนดที่พบบ่อยในการฝังแอปพลิเคชันของบุคคลที่สามไว้ในเว็บไซต์ของคุณโดยเฉพาะอย่างยิ่งเมื่อบริการเว็บและอื่น ๆ ที่คล้ายกันไม่ใช่ตัวเลือก
Jacques

9

ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกันเมื่อฉันพยายามลบโดเมนสำหรับ iframe.src

สำหรับฉันคำตอบคือการเปลี่ยน iframe.src เป็น url บนโดเมน SAME แต่จริงๆแล้วเป็นหน้าเปลี่ยนเส้นทาง html ไปยังโดเมนที่ต้องการ จากนั้นโดเมนอื่นก็ปรากฏใน iframe ของฉันโดยไม่มีข้อผิดพลาดใด ๆ

ทำงานอย่างมีเสน่ห์ :)


คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่คุณทำที่นี่ได้ไหม
Devin G Rhode

มันจะมีประโยชน์มากถ้าคุณสามารถอธิบายสั้น ๆ
Madhusudhan

2
ไม่ทำงานใน Chrome ล่าสุด: ไม่ตรวจสอบพารามิเตอร์ src แต่โหลด URL จริง ดังนั้นเคล็ดลับการเปลี่ยนเส้นทางไม่ได้ช่วย แต่อย่างใด :-(
lucaferrario

3
ฉันเชื่อว่าสิ่งที่ทอมมี่อ้างถึงคือพร็อกซีฝั่งเซิร์ฟเวอร์ ดูเช่นbenalman.com/projects/php-simple-proxyหรือdeveloper.yahoo.com/javascript/howto-proxy.htmlหรือgoogle.com/…หรือโซลูชันของRené de Kat ที่stackoverflow.com/a/11224975/27938
Oskar Austegard

เรียบร้อย แต่เพียงแค่แสดงให้เห็นว่าโดยทั่วไปแล้วการหลีกเลี่ยงปัญหานี้เป็นเรื่องเล็กน้อย เอาล่ะสมมติว่าฉันเป็นแฮ็กเกอร์ประสงค์ร้ายและฉันต้องการเรียกใช้การโจมตีแบบสคริปต์ข้ามโดเมน มีโอกาสที่ฉันจะรู้เกี่ยวกับเครื่องมือเหล่านี้และนำไปใช้ เท่าที่การแก้ไขความปลอดภัยของเบราว์เซอร์สิ่งนี้ทำได้ง่ายพอ ๆ กับ IE ที่ไม่อนุญาตให้คุณเรียกใช้ Javascript ในเครื่องโดยไม่มีคำเตือน ไม่มีปัญหา สร้างกลุ่มใหม่
Yitzhak

6

วิธีแก้ปัญหาคือการใช้ไฟล์โลคัลซึ่งดึงเนื้อหาระยะไกล

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();
});


1
นี่เป็นการเปิดประตูสำหรับช่องโหว่การเขียนสคริปต์ข้ามไซต์ ตัวอย่างของการโจมตีที่เป็นไปได้: 1. ฉันสร้างเพจบน myevilserver.com ที่ดูเหมือนกับไซต์ของคุณรวมถึงแบบฟอร์มการเข้าสู่ระบบที่โพสต์กลับไปที่ myevilserver.com 2. ฉันส่งจดหมายข่าวปลอมไปยังผู้ใช้ของคุณพร้อมลิงก์ไปยัง https: // yoursite.com/remoteInclude.php?url=myevilserver.com 3. พวกเขาเห็นแบบฟอร์มการเข้าสู่ระบบบนไซต์ของคุณที่ฉันบันทึกบนเซิร์ฟเวอร์ของฉัน
EricP

2
วิธีแก้ไขที่เป็นไปได้คือการทำให้ remoteInclude.php ตรวจสอบ url ทั้งหมดกับรายการโดเมนที่ได้รับการอนุมัติล่วงหน้า
EricP

วิธีนี้ไม่ได้แก้ปัญหาช่องโหว่ของการเขียนสคริปต์ข้ามไซต์ ไม่มีอะไรที่ฉันสามารถทำได้ด้วย Javascript ไปยังเว็บไซต์ภายนอกที่ฉันไม่สามารถทำได้จากฝั่งเซิร์ฟเวอร์ ทั้งหมดนี้เป็นอุปสรรคต่อเบราว์เซอร์และทำให้เว็บแอปมีประโยชน์น้อยลงด้วยการแนะนำขั้นตอนพิเศษ คุณยังคงทำสิ่งเหล่านี้ได้ทั้งหมดหากคุณโหลดผ่าน ajax เขียนลิงก์ซ้ำและโพสต์กลับ หากไม่ได้ผลให้รีโมต rpc ผ่าน php หรือภาษาอะไรก็ได้ เป็นเรื่องไร้สาระที่นี่เป็นปัญหาสำหรับ coder โดยเฉลี่ย
Yitzhak

3

ฉันพบว่าการใช้ปุ่มไลค์ Facebook เวอร์ชัน XFBML แทนเวอร์ชัน HTML5 ช่วยแก้ปัญหานี้ได้ เพิ่มรหัสด้านล่างที่คุณต้องการให้ปุ่มปรากฏ:

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

จากนั้นเพิ่มสิ่งนี้ลงในแท็ก HTML ของคุณ:

 xmlns:fb="http://ogp.me/ns/fb#"

2
Facebook ต้องทำอย่างไรกับคำถามนี้?
Kukks

16
เนื่องจากคุณได้รับข้อผิดพลาดนี้บนปุ่มเช่น facebook และฉันพบหน้านี้เมื่อค้นหาคำตอบดังนั้นคิดว่าคนอื่นอาจต้องการคำตอบ
Luke Alderton

1

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.